Ich versuche, mit TFilestream auf eine Netzwerkfreigabe (lokal) zu schreiben. Alles funktioniert gut, sollte die Netzwerkverbindung nicht unterbrochen werden.Delphi Schreiben in eine Netzwerkfreigabe mit TFilestream sperrt die Datei, wenn das Netzwerk verloren geht
Wenn ich jedoch das Netzwerkkabel ziehen und dann erneut verbinden, scheitern nachfolgende Versuche, den Dateistream zu öffnen, aufgrund von Zugriffsbeschränkungen. Ich kann die Datei auch nicht im Explorer löschen! Es scheint, dass TFilestream die Datei sperrt und die einzige Möglichkeit, dies zu umgehen, ist ein Neustart.
In meiner Anwendung halte ich die Datei die ganze Zeit offen, während ich schreibe (es ist eine Protokolldatei, die einmal pro Sekunde geschrieben wird).
Mein Code, der unter fehlschlägt:
procedure TFileLogger.SetLogFilename(const Value: String);
var line : String;
Created : Boolean;
begin
if not DirectoryExists(ExtractFilePath(Value)) then //create the dir if it doesnt exist
begin
try
ForceDirectories(ExtractFilePath(Value));
except
ErrorMessage(Value); //dont have access to the dir so flag an error
Exit;
end;
end;
if Value <> FLogFilename then //Either create or open existing
begin
Created := False;
if Assigned(FStream) then
FreeandNil(FStream);
if not FileExists(Value) then //create the file and write header
begin
//now create a new file
try
FStream := TFileStream.Create(Value,fmCreate);
Created := True;
finally
FreeAndNil(FStream);
end;
if not Created then //an issue with creating the file
begin
ErrorMessage(Value);
Exit;
end;
FLogFilename := Value;
//now open file for writing
FStream := TFileStream.Create(FLogFilename,fmOpenWrite or fmShareDenyWrite);
try
line := FHeader + #13#10;
FStream.Seek(0,soFromEnd);
FStream.Write(Line[1], length(Line));
FSuppress := False;
except
ErrorMessage(Value);
end;
end else begin //just open it
FLogFilename := Value;
//now open file for writing
FStream := TFileStream.Create(FLogFilename,fmOpenWrite or fmShareDenyWrite); //This line fails if the network is lost and then reconnected
end;
end;
end;
Wenn jemand einen Rat hat, würde es geschätzt.
Ist das wirklich ein Problem mit TFileStream? Wenn ja, dann verwende einfach etwas anderes, wie CreateFile. –