15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту




Как узнать, используется ли файл в данный момент другим приложением

Способ 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;