Как узнать, используется ли файл в данный момент другим приложением 2
function ApplicationUse(fName: string): boolean;
var
HFileRes: HFILE;
begin
Result := false;
ifnot 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);
ifnot Result then CloseHandle(HFileRes);
end;
// Далее следует пример использования этой функции:procedure TForm1.Button1Click(Sender: TObject);
beginif ApplicationUse('c:\project1.exe') then
ShowMessage('Application in use')
else
ShowMessage('Application not in use');
end;
Перевод:
Функция ApplicationUse проверяет, используется ли файл другой приложением. Это делается путем попытки создания handles к файлу с помощью функции API CreateFile и проверки, является ли возвращенный handle недопустимым значением (INVALID_HANDLE_VALUE). Если handle не является недопустимым значением, то это означает, что файл открыт в другом процессе, поэтому функция возвращает true.
Вот некоторые важные точки для рассмотрения:
Функция CreateFile создает новый файл или открывает существующий для чтения и записи. Флаги GENERIC_READ и GENERIC_WRITE позволяют вызывающему процессу читать из файла и писать в него.
Флаг OPEN_EXISTING указывает функции CreateFile, что она должна открыть существующий файл вместо создания нового.
Флаг FILE_ATTRIBUTE_NORMAL specifies, что файл должен быть открыт с нормальными атрибутами (т.е., не в эксклюзивном режиме).
Если файл не найден, функция немедленно выходит без попытки создать handle.
Вот альтернативное решение с использованием Windows API:
function ApplicationUse(fName: string): boolean;
var
hFile: THandle;
begin
Result := false;
if not FileExists(fName) then Exit;
hFile := GetFileVersionInfoHandle(PChar(fName), 0);
Result := (hFile = INVALID_HANDLE_VALUE);
if not Result then CloseHandle(hFile);
end;
Функция использует API GetFileVersionInfoHandle для получения handles к файлу. Если возвращенный handle является недопустимым значением (INVALID_HANDLE_VALUE), то это означает, что файл открыт в другом процессе, поэтому функция возвращает true. Обратите внимание, что данный подход работает только в том случае, если другое приложение открыло файл для чтения или записи; он не будет обнаруживать приложения, которые открыли файл для выполнения (например, запуска исполняемого файла).
Статья описывает функцию для определения, используется ли файл в данный момент другим приложением, и предоставляет пример ее использования в программировании на языке Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.