Файл проверки открыт в Delphi
Вопрос
Есть ли способ проверить, был ли файл открыт с помощью ReWrite в Delphi?
Код будет выглядеть примерно так:
AssignFile(textfile, 'somefile.txt');
if not textFile.IsOpen then
Rewrite(textFile);
Решение
Вы можете получить файловый режим.(Минутку, я приведу пример).
TTextRec(текст).Mode предоставляет вам режим:
55216 = closed
55217 = open read
55218 = open write
fmClosed = $D7B0;
fmInput = $D7B1;
fmOutput = $D7B2;
fmInOut = $D7B3;
Найдите TTextRec в системном блоке для получения дополнительной информации.
Другие советы
Попробуй это:
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;
Это работает нормально:
function IsOpen(const txt:TextFile):Boolean;
const
fmTextOpenRead = 55217;
fmTextOpenWrite = 55218;
begin
Result := (TTextRec(txt).Mode = fmTextOpenRead) or (TTextRec(txt).Mode = fmTextOpenWrite)
end;
Мне было проще сохранить логическую переменную в качестве компаньона;пример: bFileIsOpen
.Где бы ни был открыт файл, установите bFileIsOpen := true
затем, всякий раз, когда вам нужно узнать, открыт ли файл, просто проверьте эту переменную;пример: if (bFileIsOpen) then Close(datafile);
Ответ Джозефа работает отлично - я вызвал функцию filenotopen
и изменил строку, если
Result := (HFileRes = INVALID_HANDLE_VALUE);
Для
Result := NOT (HFileRes = INVALID_HANDLE_VALUE);
Я также удалил строку "if not (Result) then begin" (и "end"), чтобы она ВСЕГДА закрывала дескриптор или последующие назначения и считывала выдачу ошибок
Теперь я называю это так
if filenotopen(filename) then
begin
assignfile(f,filename);
reset(f)
etc;
end
else
message('file open by a different program')