Проверка открытия файла в Delphi - PullRequest
14 голосов
/ 26 сентября 2008

Есть ли способ проверить, был ли файл открыт ReWrite в Delphi?

Код будет выглядеть примерно так:

AssignFile(textfile, 'somefile.txt');
if not textFile.IsOpen then
   Rewrite(textFile);

Ответы [ 5 ]

17 голосов
/ 26 сентября 2008

Вы можете получить файл режима. (Один момент, я создам пример).

TTextRec (txt). Режим дает вам режим:

55216 = closed
55217 = open read
55218 = open write

fmClosed = $D7B0;
fmInput  = $D7B1;
fmOutput = $D7B2;
fmInOut  = $D7B3;

Поиск TTextRec в системном блоке для получения дополнительной информации.

12 голосов
/ 26 сентября 2008

Попробуйте это:

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;
7 голосов
/ 17 ноября 2011

Это прекрасно работает:

function IsOpen(const txt:TextFile):Boolean;
const
  fmTextOpenRead = 55217;
  fmTextOpenWrite = 55218;
begin
  Result := (TTextRec(txt).Mode = fmTextOpenRead) or (TTextRec(txt).Mode = fmTextOpenWrite)
end;
1 голос
/ 11 октября 2011

Я обнаружил, что проще использовать булеву переменную в качестве компаньона; пример: bFileIsOpen. Везде, где файл открыт, установите bFileIsOpen := true, а затем, когда вам нужно узнать, открыт ли файл, просто протестируйте эту переменную; пример: if (bFileIsOpen) then Close(datafile);

0 голосов
/ 10 января 2015

Ответ Джозефа работает отлично - я вызвал функцию filenotopen и изменил строку, если

Result := (HFileRes = INVALID_HANDLE_VALUE);

до

Result := NOT (HFileRes = INVALID_HANDLE_VALUE);

Я также удалил строку «если нет (Результат), затем начало» (и «конец»), чтобы она ВСЕГДА закрывала дескриптор или последующие назначения и считывала ошибки

Я сейчас называю это так

if filenotopen(filename) then 
  begin
    assignfile(f,filename);
    reset(f)
    etc;
  end
else
  message('file open by a different program')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...