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);
Foi útil?

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')
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top