Как узнать, используется ли файл в данный
момент другим приложением
Способ 1 (при помощи TFileStream):
function E9FileStatus(Const Origin: string): boolean;
var
F: TFileStream;
begin
{
Значение
Описание
fmCreate
Создаёт файл
с данным именем. Если файл существует, то открыть
его в
режиме
записи.
fmOpenRead
Открыть файл только для чтения.
fmOpenWrite
Открыть файл только на
запись. При этом запись в файл заменит всё его
содержимое.
fmOpenReadWrite Открыть файл скорее для
изменения содержимого чем для замены его.
Режим доступа должен иметь одно из
следующих значений:
Значение
Описание
fmShareCompat Доступ к
файлу совместим с FCB.
fmShareExclusive Другое
приложение не может открыть файл для различных
целей.
fmShareDenyWrite Другое
приложение может открыть файл для чтения, но не
для записи.
fmShareDenyRead Другое
приложение может открыть файл для записи, но не
для чтения.
fmShareDenyNone Разрешить
другим файлам делать с файлом и чтени и запись.
Если файл невозможно открыть, то Create
сгенерирует исключение.
Возвращает true если файл не
заблокирован
}
try
F := TFileStream.Create(Origin, fmOpenReadWrite OR
fmShareExclusive);
try
Result := true;
finally
F.Free;
end;
except
Result := false;
end;
end;
Способ 2 (при помощи WIN32 API):
Function ApplicationUse(fName : string ) : boolean;
var
HFileRes : HFILE;
begin
Result := false;
if not FileExists(fName) then exit;
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 CloseHandle(HFileRes);
end;
Далее следует пример использования этой функции:
procedure TForm1.Button1Click(Sender: TObject);
begin
if ApplicationUse('c:\project1.exe') then
ShowMessage('Application in use')
else
ShowMessage('Application not
in use');
end;
|