Im tratando de escribir en un recurso compartido de red (local) mediante TFilestream. Todo funciona bien si la conexión de red no se interrumpe.Delphi escribiendo en un recurso compartido de red utilizando TFilestream bloquea el archivo cuando se pierde la red
Sin embargo, si desenchufo el cable de red y luego lo vuelvo a conectar, los intentos subsiguientes de abrir la secuencia de archivos fallan debido a restricciones de acceso. ¡Tampoco puedo borrar el archivo en el explorador! Parece que TFilestream bloquea el archivo y la única forma de evitar esto es reiniciar.
En mi aplicación, mantengo el archivo abierto todo el tiempo que escribo (es un archivo de registro escrito una vez por segundo).
Mi código que falla es el siguiente:
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;
Si alguien tiene algún consejo sería apreciado.
¿Es esto realmente un problema con TFileStream? Si es así, simplemente usa algo más, como CreateFile. –