Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi TFileStream oder File, Datenverlust beim Schreiben (https://www.delphipraxis.net/157917-tfilestream-oder-file-datenverlust-beim-schreiben.html)

Daniela.S 29. Jan 2011 16:21

TFileStream oder File, Datenverlust beim Schreiben
 
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

Bernhard Geyer 29. Jan 2011 16:38

AW: TFileStream oder File, Datenverlust beim Schreiben
 
Zitat:

Zitat von Daniela.S (Beitrag 1078129)
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 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