![]() |
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:
oder so...
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;
Delphi-Quellcode:
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.
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; Was ich noch vergessen habe zu erwähnen... ein Truncate(SourceFile); funktioniert komischerweise??? Und es passiert auch nicht immer??? vielen lieben Dank, Daniela |
AW: TFileStream oder File, Datenverlust beim Schreiben
Zitat:
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 21:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz