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