Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка 32: Процесс не может получить доступ к файлу, так как этот файл занят другим ... / 10 сообщений из 10, страница 1 из 1
09.05.2021, 09:52
    #40069078
m52
m52
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 32: Процесс не может получить доступ к файлу, так как этот файл занят другим ...
Здравствуйте,

При копировании файла с помощью CopyFileEx, CopyFile иногда возникает ошибка вида:
Code 32: Процесс не может получить доступ к файлу, так как этот файл занят другим процессом

Как я понял, никто не застрахован от такой ошибки, которая возникает время от времени, как-то через раз. Есть подозрение, что в момент обращения к файлу его блокирует антивирусник.

Можно ли из программы Delphi узнать, какой сторонний процесс блокирует копируемый файл (ведь Far Manager как-то это определяет и показывает)? Хотелось бы из Delphi это узнать и показать пользователю имя процесса, который блокирнул файл.

Заранее благодарен.
...
Рейтинг: 0 / 0
09.05.2021, 12:10
    #40069081
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 32: Процесс не может получить доступ к файлу, так как этот файл занят другим ...
...
Рейтинг: 0 / 0
09.05.2021, 16:42
    #40069098
m52
m52
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 32: Процесс не может получить доступ к файлу, так как этот файл занят другим ...
GunSmoker,

Спасибо за пример, хотя мне кажется он бесполезен из-за главного недостатка - Этот API рассчитывает на то, что программа, заблокировавшая файл, реализует и зарегистрирует специальный интерфейс. Если же приложение не озаботится этой задачей, то вы не сможете использовать этот метод.

Я уверен, что 95% программ никакой специальный интерфейс не реализуют.

Код: pascal
1.
2.
3.
4.
5.
var FileInfo: IFileIsInUse;
begin
  FileInfo:=GetFileInUseInfo('G:\Programs\Telegram\tdata\working');
  здесь FileInfo=nil
end;


Проверял на 2-х файлах. На одном из них Far Manager выдал конкретно ID и имя процесса, который заблокировал указанный файл, а предложенная функция GetFileInUseInfo возвращает nil (не проходит условие while (enumMoniker.Next(1, enumIndex, nil) = S_OK) - возвращает число 1)

Видимо, есть какой-то другой способ узнать имя или ID процесса, который блокирует файл.
...
Рейтинг: 0 / 0
09.05.2021, 18:15
    #40069103
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 32: Процесс не может получить доступ к файлу, так как этот файл занят другим ...
...
Рейтинг: 0 / 0
09.05.2021, 21:43
    #40069109
m52
m52
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 32: Процесс не может получить доступ к файлу, так как этот файл занят другим ...
Огромное спасибо!
Это то, что надо.
Я конечно переделал под себя этот код, но работает отлично, тестировал на разных ОС семейства Windows.
Задача решена.
...
Рейтинг: 0 / 0
10.05.2021, 13:57
    #40069160
m52
m52
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 32: Процесс не может получить доступ к файлу, так как этот файл занят другим ...
Еще такой вопрос.
В Windows 2003 server и Windows XP программа перестала запускаться - ругается на отсутствие 'Rstrtmgr.dll'. Видимо, Restart Manager еще не существовал во времена XP. В моем модуле при указании внешних ф-ций QueryFullProcessImageName, RmStartSession и др. указана
Код: pascal
1.
external 'Rstrtmgr.dll';


Как сделать, чтобы для WinXP вообще не работал данный unit? Соответственно, связанных с этим функций в WinXP я вызывать не буду.

Я конечно условием IF могу проверить, в какой версии Windows запущена программа, но dll пытается подгрузить еще при загрузке exe-файла, когда инициализируются все модули.
...
Рейтинг: 0 / 0
10.05.2021, 14:03
    #40069161
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 32: Процесс не может получить доступ к файлу, так как этот файл занят другим ...
Динамическая загрузка с помощью LoadLibrary тебе в руки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.05.2021, 18:14
    #40069199
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 32: Процесс не может получить доступ к файлу, так как этот файл занят другим ...
m52
Как сделать, чтобы для WinXP вообще не работал данный unit? Соответственно, связанных с этим функций в WinXP я вызывать не буду.

Если версия дельфей позволяет, можно использовать отложенную загрузку:
Код: pascal
1.
procedure someproc(astring: pwidechar); stdcall; external 'somelib.dll' name 'someproc' delayed;
...
Рейтинг: 0 / 0
10.05.2021, 19:22
    #40069206
m52
m52
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 32: Процесс не может получить доступ к файлу, так как этот файл занят другим ...
Kazantsev Alexey,

Спасибо огромное! Это как раз то, что нужно!
Теперь всё отлично работает.
...
Рейтинг: 0 / 0
10.05.2021, 21:07
    #40069215
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка 32: Процесс не может получить доступ к файлу, так как этот файл занят другим ...
m52
Kazantsev Alexey,

Спасибо огромное! Это как раз то, что нужно!
Теперь всё отлично работает.


LoadLibrary гораздо более правильно
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка 32: Процесс не может получить доступ к файлу, так как этот файл занят другим ... / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]