AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi TFileStream oder File, Datenverlust beim Schreiben
Thema durchsuchen
Ansicht
Themen-Optionen

TFileStream oder File, Datenverlust beim Schreiben

Ein Thema von Daniela.S · begonnen am 29. Jan 2011 · letzter Beitrag vom 29. Jan 2011
Antwort Antwort
Benutzerbild von Daniela.S
Daniela.S

Registriert seit: 1. Mär 2008
Ort: Niederösterreich
226 Beiträge
 
Delphi XE4 Enterprise
 
#1

TFileStream oder File, Datenverlust beim Schreiben

  Alt 29. Jan 2011, 17:21
Schönen Nachmittag euch,

ich häng schon eine Weile jetzt an einem Problem, wo ich einfach nicht weiterkomme.

Eine Funktion zum Schreiben in eine Datei, die auf lokalen NTFS Festplatten in eine Datei schreibt, macht im Netzwerk auf meinem NAS mit EXT4 Dateiformat Probleme. Funktioniert eigentlich einwandfrei seit Jahren. Doch jedesmal wenn ich in eine Datei am NAS schreiben möchte bekomme ich eine Meldung "Zugriff verweigert" und die obligatorische "Datenverlust beim Schreiben" Meldung von Windows.

Nun, normalerweise funktioniert das Schreiben mit den Methoden (siehe unten) auch, nur wenn die Datei bereits geöffnet ist, bekomme Fehler. An und für sich ja ok, aber trotzdem lässt sich der Stream zum Schreiben öffnen, wo er ja eigentlich nicht dürfte wenn die Datei gerade geöffnet ist.

Folgende Methoden (aufs wesentliche beschränkt) habe ich ausprobiert...
Jeweils an der Markierung kommt der Fehler. Wie gesagt funktioniert lokal alles, darum vermute ich dass es vielleicht mit dem EXT4 Dateisystem zusammenhängt.

Delphi-Quellcode:
type
  TInfo = packed record
    Size : DWord;
    Header : array [1..7] of Char;
    end;
var
  fs : TFileStream;
  info : TInfo;
begin
  fs := TFileStream.Create( FileName, fmOpenReadWrite or fmShareDenyNone ); // auch mit fmShareExclusive gehts nicht
  try
    fs.Position := fs.Size;
    fs.WriteBuffer( info, SizeOf( info ) ); // <--
  finally
    fs.Free;
    end;
end;
oder so...
Delphi-Quellcode:
type
  TInfo = packed record
    Size : DWord;
    Header : array [1..7] of Char;
    end;
var
  SourceFile : file;
  info : TInfo;
begin
  AssignFile( SourceFile, FileName);
  try
    FileMode := 2;
    Reset( SourceFile, 1 );
    Seek( SourceFile, FileSize(SourceFile) - SizeOf(Info) );
    Truncate( SourceFile );
    BlockWrite( SourceFile, Info, SizeOf(Info) ); // <--
  finally
    CloseFile( SourceFile );
    end;
end;
Im Grunde ist es nicht so wichtig diese Information an die Datei anzuhängen. Falls die Datei gerade geöffnet würde die Information halt später reinkommen, nur müsste man irgendeine Info bekommen dass dem so ist. Es würde auch reichen wenn man die Fehlermeldung unterdrücken könnte. Ein try/except reicht dafür leider nicht aus.

Was ich noch vergessen habe zu erwähnen...
ein Truncate(SourceFile); funktioniert komischerweise??? Und es passiert auch nicht immer???



vielen lieben Dank,
Daniela

Geändert von Daniela.S (29. Jan 2011 um 17:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TFileStream oder File, Datenverlust beim Schreiben

  Alt 29. Jan 2011, 17:38
Nun, normalerweise funktioniert das Schreiben mit den Methoden (siehe unten) auch, nur wenn die Datei bereits geöffnet ist, bekomme Fehler. An und für sich ja ok, aber trotzdem lässt sich der Stream zum Schreiben öffnen, wo er ja eigentlich nicht dürfte wenn die Datei gerade geöffnet ist.
Das Problem wird die Serverimplementierung sein. Die Zugriffsbeschränkungsregeln die NTFS/Windows vorgiebt wird bei diversen NAS-Implementierungen ignoriert/nicht korrekt umgesetzt so das man sich hier eigentlich auf nix verlassen kann. Selbst Anforderung exklusiver Zugriffsrechte führt nicht dazu das nur ein Prozess Zugriff auf die Datei bekommt.

Die Fehlermeldung wird vermutlich direkt von Windows geworfen weil der Dateitreiber merkt das hier was falsch läuft.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz