Verificando arquivo está aberto em Delphi
Pergunta
Existe uma maneira de verificar se um arquivo foi aberto por reescrever em Delphi?
código seria algo parecido com isto:
AssignFile(textfile, 'somefile.txt');
if not textFile.IsOpen then
Rewrite(textFile);
Solução
Você pode obter o fileMode. (Um momento, vou criar um exemplo.)
TTextRec (txt) .Mode dá-lhe o modo:
55216 = closed
55217 = open read
55218 = open write
fmClosed = $D7B0;
fmInput = $D7B1;
fmOutput = $D7B2;
fmInOut = $D7B3;
Pesquisa TTextRec na unidade do sistema para obter mais informações.
Outras dicas
Tente isto:
function IsFileInUse(fName: string) : boolean;
var
HFileRes: HFILE;
begin
Result := False;
if not FileExists(fName) then begin
Exit;
end;
HFileRes := CreateFile(PChar(fName)
,GENERIC_READ or GENERIC_WRITE
,0
,nil
,OPEN_EXISTING
,FILE_ATTRIBUTE_NORMAL
,0);
Result := (HFileRes = INVALID_HANDLE_VALUE);
if not(Result) then begin
CloseHandle(HFileRes);
end;
end;
Esta multa funciona:
function IsOpen(const txt:TextFile):Boolean;
const
fmTextOpenRead = 55217;
fmTextOpenWrite = 55218;
begin
Result := (TTextRec(txt).Mode = fmTextOpenRead) or (TTextRec(txt).Mode = fmTextOpenWrite)
end;
Eu achei mais fácil para manter uma variável booleana como um companheiro; exemplo: bFileIsOpen
. Onde quer que o arquivo é aberto, conjunto bFileIsOpen := true
então, sempre que você precisa saber se o arquivo é aberto, apenas testar essa variável; exemplo: if (bFileIsOpen) then Close(datafile);
A resposta de Joseph funciona perfeitamente - Liguei para a função filenotopen
e mudou a linha se
Result := (HFileRes = INVALID_HANDLE_VALUE);
para
Result := NOT (HFileRes = INVALID_HANDLE_VALUE);
Eu também removeu a linha 'se não for (Result), em seguida, começar' (eo 'end') de modo que ele sempre fecha o identificador ou posteriores atribuições e leituras dar erros
Agora eu chamá-lo assim
if filenotopen(filename) then
begin
assignfile(f,filename);
reset(f)
etc;
end
else
message('file open by a different program')