Тестирование доступа к исполняемым файлам через сетевую папку в Delphi 7 и C
Вопрос, поднятый пользователем, связан с созданием программы обновления для клиент-серверного приложения, которая будет заменять список исполняемых файлов, запускать скрипты и выполнять другие необходимые обновления. Программа будет установлена на сервере, и одной из первых задач является проверка, открыт ли исполняемый файл через сетевую папку.
Проблема
Для проверки, открыт ли файл, пользователь вручную мог бы проверить это, используя "Управление компьютером", но для автоматизации процесса требуется программный способ проверки.
Попытки решения
Проверка доступа на чтение/запись (R/W) не дала результата.
Использование Win32_ServerConnection позволило увидеть количество открытых файлов, но не их имена.
Возможные подходы
Попытка удаления файла - если файл открыт, удаление вызовет ошибку.
Проверка списка серверов - если имя компьютера соответствует списку, можно предположить, что файл открыт локально.
Использование API NetFileEnum - на Windows 2000 и более поздних версиях для перечисления файлов, открытых через сетевую папку.
Получение файлового дескриптора - попытка открыть файл для чтения и записи, что позволит определить, открыт ли файл.
Подтвержденное решение
Использование функции IsFileInUse, которая пытается открыть файл для чтения и записи без фактического создания или изменения файла. Если функция не может получить файловую дескриптор (возвращает INVALID_HANDLE_VALUE), это означает, что файл используется.
function IsFileInUse(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;
Заключение
Выбор метода зависит от конкретных требований и ограничений проекта. Все методы требуют соответствующих привилегий для выполнения. Пример с функцией IsFileInUse является универсальным решением, которое подходит для большинства сценариев и работает в том числе для файлов, открытых через сетевую папку на удаленном компьютере.
Вопрос касается разработки программы обновления для клиент-серверного приложения, где необходимо автоматизировать проверку, открыт ли исполняемый файл через сетевую папку.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS