Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Тестирование доступа к исполняемым файлам через сетевую папку в Delphi 7 и C#

Delphi , ОС и Железо , Windows

Тестирование доступа к исполняемым файлам через сетевую папку в Delphi 7 и C

Вопрос, поднятый пользователем, связан с созданием программы обновления для клиент-серверного приложения, которая будет заменять список исполняемых файлов, запускать скрипты и выполнять другие необходимые обновления. Программа будет установлена на сервере, и одной из первых задач является проверка, открыт ли исполняемый файл через сетевую папку.

Проблема

Для проверки, открыт ли файл, пользователь вручную мог бы проверить это, используя "Управление компьютером", но для автоматизации процесса требуется программный способ проверки.

Попытки решения

  • Проверка доступа на чтение/запись (R/W) не дала результата.
  • Использование Win32_ServerConnection позволило увидеть количество открытых файлов, но не их имена.

Возможные подходы

  1. Попытка удаления файла - если файл открыт, удаление вызовет ошибку.
  2. Проверка списка серверов - если имя компьютера соответствует списку, можно предположить, что файл открыт локально.
  3. Использование API NetFileEnum - на Windows 2000 и более поздних версиях для перечисления файлов, открытых через сетевую папку.
  4. Получение файлового дескриптора - попытка открыть файл для чтения и записи, что позволит определить, открыт ли файл.

Подтвержденное решение

Использование функции 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 11:36:24/0.0034899711608887/0