Ошибка 32 (файл используется другим процессом) при переименовании файла

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

  открытый файл.  dat записать запись в file.datclose file.dat ... open file.dat записать запись в file.datclose file.dat переименовать file.dat в file20110818123456.datcreate file.datopen file.dat записать запись в file.datclose file.dat.  ..  

Проблема в том, что иногда переименование не удается с Ошибка 32 - процесс не может получить доступ к файлу, потому что он используется другим процессом . Я проверяю, что адресата переименования не существует. Как будто закрытие файла после записи записи происходит не сразу. Я добавил цикл в процедуру переименования, чтобы ненадолго засыпать, и повторил попытку до 10 раз, но это не помогло.

  function RenameFileAtAllCosts (const OldFileID: TFilename; const NewFileID: TFilename; out ErrorCode: Integer): boolean; const MaxRenameAttempts = 10; var RenameAttempts: integer; beginResult: = FileExists (  OldFileID); если (Результат = true), то начать, если FileExists (NewFileID), то начать Результат: = DeleteFile (PChar (NewFileID));  конец ;  if (Result = true) then begin Result: = (не FileExists (NewFileID));  конец ;  если (Результат = истина), то начать RenameAttempts: = 0;  повторить SysUtils.Sleep (50);  Результат: = RenameFile (OldFileID, NewFileID);  inc (RenameAttempts) до (Результат или (RenameAttempts> = MaxRenameAttempts));  конец ;  конец; если (не результат), то начало ErrorCode: = GetLastError;  end; end;  

* ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ *

Это журнал ProcMon соответствующего дискового I/ O, со связанным исходным кодом Pascal или псевдокодом перед каждым блоком

  open file.dat записать запись в file.datclose file.dat 5: 45: 27.1718325 PM APP.exe  1276 CreateFile C:  Users  Public  Documents  APP  Datafile  APP.DAT УСПЕХ Требуемый доступ: общий доступ для чтения/записи, расположение: открыто, параметры: синхронный ввод-вывод без предупреждения, файл без каталога, атрибуты: N, режим общего доступа:  Чтение, запись, размер AllocationSize: нет данных, OpenResult: Opened5: 45: 27.1719739 PM APP.exe 1276 QueryStandardInformationFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS Размер размещения: 57 344, EndOfFile: 54 208, NumberOfLinks:  1, DeletePending: False, Directory: False 5: 45: 27.1720475 PM APP.exe 1276 WriteFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS Смещение: 54 208, длина: 28, приоритет: нормальный 5: 45:  27.1721403 PM APP.exe 1276 CloseFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SU  CCESSif FileExists (NewFileID) then//перед вызовом RenameFileAtAllCosts begin5: 45: 27.8630005 PM APP.exe 1276 CreateFile C:  Users  Public  Documents  APP  Datafile  APP20110819054527.DAT NAME NOT FOUND Желаемый доступ: чтение атрибутов, удаление:  Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/aif DeleteFile (NewFileID) затем//перед вызовом RenameFileAtAllCosts begin5: 45: 27.8634050 PM APP. exe 1276 CreateFile C:  Users  Public  Documents  APP  Datafile  APP20110819054527.DAT NAME NOT FOUND Желаемый доступ: чтение атрибутов, удаление, расположение: открыть, параметры: файл вне каталога, открыть точку повторной обработки, атрибуты: нет  , ShareMode: чтение, запись, удаление, размер распределения: n/aResult: = FileExists (OldFileID); 5: 45: 27.8640878 PM APP.exe 1276 CreateFile C:  Users  Public  Documents  APP  Datafile  APP.DAT УСПЕХ Желаемый  Доступ: чтение атрибутов, расположение: открыто, параметры: открытая точка повторной обработки, атрибуты: нет данных, режим совместного использования: чтение, запись, удаление, размер распределения: нет данных, OpenResult: открыт 5: 45: 27.8641684 PM APP.exe 1276 QueryBasicInformationFile C:   Users  Public  Documents  APP  Datafile  APP.DAT УСПЕХ Время создания: 2 августа 2011 г., 19:45:59, LastAccessTime: 19 августа 2011 г., 16:25:33, LastWriteTime: 19 августа 2011 г.  17:45:27, ChangeTime: 19.08.2011 17:45:27, FileAttributes: A5: 45: 27.8641902 PM APP.exe 1276 CloseFile C:  Users  Public  Documents  APP  Datafile  APP.DAT  УСПЕХ, если FileExists (NewFileID), то начало 5: 45: 27.864869  8 вечера APP.exe 1276 CreateFile C:  Users  Public  Documents  APP  Datafile  APP20110819054527.DAT NAME NOT FOUND Требуемый доступ: чтение атрибутов, расположение: открыто, параметры: открыть точку повторной обработки, атрибуты: нет, режим общего доступа:  Чтение, запись, удаление, размер AllocationSize: н/д, если (Результат = true), то начало Результат: = (не FileExists (NewFileID));  конец; 5: 45: 27.8656780 PM APP.exe 1276 CreateFile C:  Users  Public  Documents  APP  Datafile  APP20110819054527.DAT NAME NOT FOUND Требуемый доступ: чтение атрибутов, расположение: открыть, параметры: открыть точку повторной обработки, атрибуты:  н/д, ShareMode: чтение, запись, удаление, размер выделения: н/д RenameAttempts: = 0;  повторить SysUtils.Sleep (50);  Результат: = RenameFile (OldFileID, NewFileID);  inc (RenameAttempts) до (Result или (RenameAttempts> = MaxRenameAttempts)); 5: 45: 27.9211195 PM APP.exe 1276 CreateFile C:  Users  Public  Documents  APP  Datafile  APP.DAT НАРУШЕНИЕ ОБМЕНА ДОСТУПОМ Желаемый доступ: чтение атрибутов  , Удалить, Синхронизировать, Диспозиция: Открыть, Параметры: Синхронный ввод-вывод без предупреждения, Открыть точку повторной обработки, Атрибуты: нет, ShareMode: Чтение, Запись, Удалить, Размер распределения: n/a5: 45: 27.9834427 PM APP.exe 1276 CreateFile  C:  Users  Public  Documents  APP  Datafile  APP.DAT ОБМЕН НАРУШЕНИЕМ Требуемый доступ: чтение атрибутов, удаление, синхронизация, расположение: открытое, параметры: синхронный ввод-вывод без предупреждения, открытая точка повторной обработки, атрибуты: нет,  ShareMode: чтение, запись, удаление, размер размещения: n/a5: 45: 28.0459285 PM APP.exe 1276 CreateFile C:  Users  Public  Documents  APP  Datafile  APP.DAT НАРУШЕНИЕ ОБМЕНА ДОСТУПАМИ Требуемый доступ: чтение атрибутов, удаление, синхронизация  , Расположение: Открыто, Параметры: Синхронный ввод-вывод без предупреждения, Открытая точка повторной обработки, Атрибуты: н/д, Режим общего доступа: Чтение, Запись, Удалить, Размер распределения: Н/Д5: 45: 28.10  84086 PM APP.exe 1276 CreateFile C:  Users  Public  Documents  APP  Datafile  APP. НАРУШЕНИЕ ОБМЕНА ДАННЫМИ Требуемый доступ: чтение атрибутов, удаление, синхронизация, расположение: открытое, параметры: синхронный ввод-вывод без предупреждения, открытая точка повторной обработки, атрибуты: н/д, режим общего доступа: чтение, запись, удаление, размер распределения: н/д5: 45  : 28.1710646 PM APP.exe 1276 CreateFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SHARING VIOLATION Желаемый доступ: чтение атрибутов, удаление, синхронизация, расположение: открыть, параметры: синхронный ввод-вывод без предупреждения, открытый повторный анализ  Точка, Атрибуты: нет данных, Режим общего доступа: Чтение, Запись, Удаление, Размер размещения: Нет5: 45: 28.2335139 PM APP.exe 1276 CreateFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SHARING VIOLATION Желаемое  Доступ: чтение атрибутов, удаление, синхронизация, расположение: открыто, параметры: синхронный ввод-вывод без предупреждения, открытая точка повторной обработки, атрибуты: нет данных, режим общего доступа: чтение, запись, удаление, размер распределения: нет 5: 45: 28.2959037 PM APP  .exe 1276 CreateFile C:  Users  Public  Documents  APP  Datafile  APP.DAT НАРУШЕНИЕ ОБМЕНА ДОСТУПАМИ Требуемый доступ: чтение атрибутов, удаление, синхронизация, удаление:  Открыть, Параметры: Синхронный ввод-вывод без предупреждения, Открытая точка повторной обработки, Атрибуты: н/д, Режим общего доступа: Чтение, Запись, Удалить, Размер размещения: n/a5: 45: 28.3584062 PM APP.exe 1276 CreateFile C:  Users  Public   Documents  APP  Datafile  APP.DAT SHARING VIOLATION Желаемый доступ: чтение атрибутов, удаление, синхронизация, расположение: открыто, параметры: синхронный ввод-вывод без предупреждения, открытая точка повторной обработки, атрибуты: нет, режим общего доступа: чтение, запись, удаление  , AllocationSize: n/a5: 45: 28.4209304 PM APP.exe 1276 CreateFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SHARING VIOLATION Желаемый доступ: чтение атрибутов, удаление, синхронизация, расположение: открыть, параметры:  Синхронный ввод-вывод без предупреждения, открытая точка повторной обработки, атрибуты: н/д, режим общего доступа: чтение, запись, удаление, размер распределения: н/д5: 45: 28.4834629 PM APP.exe 1276 CreateFile C:  Users  Public  Documents  APP   Datafile  APP.DAT SHARING VIOLATION Желаемый доступ: чтение атрибутов, удаление, синхронизация, расположение: открыто, параметры: синхронный ввод-вывод без предупреждения, открытая точка повторной обработки, атрибуты: нет, ShareMode  : Чтение, запись, удаление, размер AllocationSize: n/aopen file.dat записать несколько записей в file.datclose file.dat 5: 45: 28.4899722 PM APP.exe 1276 CreateFile C:  Users  Public  Documents  APP  Datafile  APP.  УСПЕХ DAT Желаемый доступ: общий доступ для чтения/записи, расположение: открыто, параметры: синхронный ввод-вывод без предупреждения, файл без каталога, атрибуты: N, режим общего доступа: чтение, запись, размер размещения: н/д, OpenResult: Opened5: 45: 28.4901002  PM APP.exe 1276 QueryStandardInformationFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS AllocationSize: 57 344, EndOfFile: 54 236, NumberOfLinks: 1, DeletePending: False, Directory: False 5: 45: 28.4901636 PM APP.exe  1276 WriteFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS Offset: 54 236, длина: 28, приоритет: Normal 5: 45: 28.4902365 PM APP.exe 1276 QueryStandardInformationFile C:  Users  Public  Documents  APP   Datafile  APP.DAT SUCCESS AllocationSize: 57 344, EndOfFile: 54 264, NumberOfLinks: 1, DeletePending: False, Directory: False5: 45: 28.4903031 PM APP. exe 1276 WriteFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS Offset: 54 264, длина: 28, приоритет: Normal5: 45: 28.4903517 PM APP.exe 1276 QueryStandardInformationFile C:  Users  Public  Documents   APP  Datafile  APP.DAT SUCCESS AllocationSize: 57 344, EndOfFile: 54 292, NumberOfLinks: 1, DeletePending: False, Directory: False5: 45: 28.4905200 PM APP.exe 1276 WriteFile C:  Users  Public  Documents  APP  Datafile   APP.DAT SUCCESS Смещение: 54,292, длина: 28, приоритет: нормальный 5: 45: 28,4905917 PM APP.exe 1276 QueryStandardInformationFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS AllocationSize: 57 344, EndOfFile: 54 320,  NumberOfLinks: 1, DeletePending: False, Directory: False5: 45: 28.4906633 PM APP.exe 1276 WriteFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS Смещение: 54,320, длина: 28, приоритет: нормальный 5:  45: 28.4907120 PM APP.exe 1276 QueryStandardInformationFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS AllocationSize: 57 344, EndOfFile: 54 348, NumberOfLin  ks: 1, DeletePending: False, Directory: False5: 45: 28.4907747 PM APP.exe 1276 WriteFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS Смещение: 54 348, длина: 28, приоритет: Normal 5:  45: 28.4908214 PM APP.exe 1276 QueryStandardInformationFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS AllocationSize: 57 344, EndOfFile: 54 376, NumberOfLinks: 1, DeletePending: False, Directory: False5: 45: 28.4908841 PM  APP.exe 1276 WriteFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS Смещение: 54 376, длина: 28, приоритет: Normal5: 45: 28.4909308 PM APP.exe 1276 QueryStandardInformationFile C:  Users  Public   Documents  APP  Datafile  APP.DAT SUCCESS AllocationSize: 57 344, EndOfFile: 54 404, NumberOfLinks: 1, DeletePending: False, Directory: False5: 45: 28.4909929 PM APP.exe 1276 WriteFile C:  Users  Public  Documents  APP   Datafile  APP.DAT SUCCESS Смещение: 54 404, длина: 28, приоритет: нормальный 5: 45: 28.49 10396 PM APP.exe 1276 QueryStandardInformationFile C:  Users  Public  Documents  APP  Datafile  AP  P.DAT SUCCESS AllocationSize: 57 344, EndOfFile: 54 432, NumberOfLinks: 1, DeletePending: False, Directory: False5: 45: 28.491 1023 PM APP.exe 1276 WriteFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS  Смещение: 54 432, длина: 28, приоритет: нормальный 5: 45: 28.49 11491 PM APP.exe 1276 QueryStandardInformationFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS AllocationSize: 57 344, EndOfFile: 54 460, NumberOfLinks: 1,  DeletePending: False, Directory: False5: 45: 28.4912118 PM APP.exe 1276 WriteFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS Смещение: 54,460, длина: 28, приоритет: нормальный5: 45: 28.4912578 PM  APP.exe 1276 QueryStandardInformationFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS AllocationSize: 57 344, EndOfFile: 54 488, NumberOfLinks: 1, DeletePending: False, Directory: False 5: 45: 28.4913206 PM APP.exe 1276  WriteFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS Смещение: 54 488, длина: 28, приоритет: нормальный 5: 45: 28.4913673 PM APP. exe 1276 QueryStandardInformationFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS AllocationSize: 57 344, EndOfFile: 54 516, NumberOfLinks: 1, DeletePending: False, Directory: False 5: 45: 28.4914300 PM APP.exe 1276 WriteFile C  :  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS Смещение: 54 516, длина: 28, приоритет: нормальный 5: 45: 28.4914761 PM APP.exe 1276 QueryStandardInformationFile C:  Users  Public  Documents  APP  Datafile   APP.DAT SUCCESS AllocationSize: 57 344, EndOfFile: 54 544, NumberOfLinks: 1, DeletePending: False, Directory: False5: 45: 28.4915388 PM APP.exe 1276 WriteFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS  Смещение: 54 544, длина: 28, приоритет: нормальный 5: 45: 28.49 15855 PM APP.exe 1276 QueryStandardInformationFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS AllocationSize: 57 344, EndOfFile: 54 572, NumberOfLinks: 1,  DeletePending: False, Directory: False5: 45: 28.4916482 PM APP.exe 1276 WriteFile C:  Users  Public  Documents  APP  Datafile  APP.DAT УСПЕХ  Смещение: 54 572, длина: 28, приоритет: нормальный 5: 45: 28,49 16936 PM APP.exe 1276 QueryStandardInformationFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS AllocationSize: 57 344, EndOfFile: 54 600, NumberOfLinks: 1,  DeletePending: False, Directory: False5: 45: 28.4917570 PM APP.exe 1276 WriteFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS Смещение: 54,600, длина: 28, приоритет: Normal5: 45: 28.4918043 PM  APP.exe 1276 QueryStandardInformationFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS AllocationSize: 57 344, EndOfFile: 54 628, NumberOfLinks: 1, DeletePending: False, Directory: False 5: 45: 28.4919003 PM APP.exe 1276  WriteFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS Offset: 54 628, Length: 28, Priority: Normal5: 45: 28.49 19483 PM APP.exe 1276 QueryStandardInformationFile C:  Users  Public  Documents  APP   Datafile  APP.DAT SUCCESS AllocationSize: 57 344, EndOfFile: 54 656, NumberOfLinks: 1, DeletePending: False, Directory: False5: 45: 28.4920110 PM APP.exe 1  276 WriteFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS Offset: 54 656, длина: 28, приоритет: Normal 5: 45: 28.49 20577 PM APP.exe 1276 QueryStandardInformationFile C:  Users  Public  Documents  APP   Datafile  APP.DAT SUCCESS AllocationSize: 57 344, EndOfFile: 54 684, NumberOfLinks: 1, DeletePending: False, Directory: False5: 45: 28.4921205 PM APP.exe 1276 WriteFile C:  Users  Public  Documents  APP  Datafile  APP  .DAT УСПЕХ Смещение: 54,684, длина: 28, приоритет: нормальный 5: 45: 28,4921672 PM APP.exe 1276 QueryStandardInformationFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS AllocationSize: 57 344, EndOfFile: 54 712, NumberOfLinks  : 1, DeletePending: False, Directory: False5: 45: 28.4922299 PM APP.exe 1276 WriteFile C:  Users  Public  Documents  APP  Datafile  APP.DAT SUCCESS Смещение: 54 712, длина: 28, приоритет: Normal5: 45  : 28.4922843 PM APP.exe 1276 CloseFile C:  Users  Public  Documents  APP  Datafile  APP. ДАТ УСПЕХ  

* ОБНОВЛЕНИЕ *

Думаю, я добился успеха. Я скачал handle.exe и запустил его. Обозреватель процессов всегда не показывает дескрипторов, соответствующих APP.DAT, но утилита handle.exe показывала список дескрипторов, принадлежащих PID 4 (System) с APP.DAT в качестве имени файла. Что я не упомянул в своем OP, так это то, что это же приложение работает на другом сетевом компьютере в режиме вторичного «монитора», где оно не записывает файлы APP * .DAT, а только читает из них. «Ага!» Был момент, когда я понял, что проблема возникает только тогда, когда приложение монитора также работает, и что утечки дескрипторов показываются как принадлежащие процессу «Система», который предположительно создал дескриптор, когда файл был открыт с сетевой машины.

Иногда приложению монитора было отказано в доступе к файлу (всегда с ошибкой 998 — Недопустимый доступ к области памяти — по какой-то причине), и путь ошибки не закрывал дескриптор. С этого момента основной экземпляр приложения все еще мог читать и записывать файл APP.DAT, но не смог выполнить переименование. Убедившись, что файл был закрыт из-за ошибки, похоже, она исправлена.

Указатель на «handle.exe» был ключом, наряду со знанием того, что я все еще могу записать в файл с другим открыл дескриптор, но переименовать не удалось. Спасибо всем за их вклад.


Мне казалось, что проблема не в конечном файле, а в исходном файле … Убедитесь, что дескриптор закрыт на исходный файл, вот где будет ваша проблема.


4

Полезный способ отладки таких проблем (по крайней мере для меня) — поиск имени файла с помощью функции «Найти/найти дескриптор или DLL» в Process Explorer. Если конкретное имя файла является открытым и эксклюзивным, оно покажет, какая программа его содержит. Если он ваш, вы можете проверить, закрывается ли ручка. Если не ваш, вам, возможно, придется либо просто закодировать небольшое ожидание (Windows иногда тратит время на то, чтобы добраться до вещей), либо принудительно разблокировать файл (у меня здесь есть небольшая программа, которая делает это с EXPLORER.EXE, потому что она будет часто удерживаю блокировки файлов, когда я его использую).

HTH.

Поделиться
Улучшить этот ответ
ответил 19 августа 2011 в 07:36
  • Поиск в Process Explorer ничего не нашел. — rossmcm 19 авг., 2011 в 8:22
  • @Nat — имя файла не совпадает — rossmcm 19 августа 2011 г., 9:42
добавить комментарий |

Полезный способ отладки таких проблем (в любом случае для меня) — это поиск имени файла с помощью «Найти/Найти дескриптор или DLL» функция Process Explorer. Если конкретное имя файла является открытым и эксклюзивным, оно покажет, какая программа его содержит. Если он ваш, вы можете проверить, закрывается ли ручка. Если не ваш, вам, возможно, придется либо просто закодировать небольшое ожидание (Windows иногда тратит время на то, чтобы добраться до вещей), либо принудительно разблокировать файл (у меня здесь есть небольшая программа, которая делает это с EXPLORER.EXE, потому что она будет часто удерживаю блокировки файлов, когда я его использую).

HTH.


1

Я уверен, что ваш вызов GetLastError возвращает код ошибки для более раннего вызова API, не имеющего отношения к этой процедуре. Насколько я помню (где я нахожусь, источника нет) FileExists не устанавливает код ошибки. Но если первый вызов FileExists завершился неудачно, вы все равно вызываете GetLastError.

Поделиться
Улучшить этот ответ
ответил 19 августа 2011 в 8:37
  • +1 Не заметил этого. OP должен выполнять вызов получения последней ошибки только непосредственно после процедуры, которая сообщает через него … Таким образом, он должен быть непосредственно после вызовов DeleteFile и RenameFile, а не полностью вниз. — Nat 19 авг., 2011, 20:51
  • Дэвид, @Nat. Конечно, я немного усердствовал в проверке GetLastError, но возвращенная ошибка (32) согласуется с журналом ProcMon (нарушение совместного доступа) — rossmcm 19 августа 2011 г., 12:17
  • Я не вижу никаких доказательств того, что вы точно знаете, какой API вызов выдает код ошибки 32. Вы точно знаете, что это такое. Разобраться несложно. — Дэвид Хеффернан 19 авг., 2011 в 13:21
добавить комментарий |

Могу поспорить, что ваш вызов GetLastError возвращает код ошибки для более раннего вызова API, не связанного с этой процедурой. Насколько я помню (где я нахожусь, источника нет) FileExists не устанавливает код ошибки. Но если первый вызов FileExists завершился неудачно, вы все равно вызываете GetLastError..


0

Помогло бы, если вы повторите попытку переименование через секунду или около того? Возможно, Windows слишком медленная, чтобы ее догнать.

Поделиться
Улучшите этот ответ
ответил 19 августа 2011 в 07:31
  • Это подозрение у меня было, и я думал, что видел где-то упоминается именно эта проблема, но на этот раз я не смог найти никаких ссылок на нее. Я бы подумал, что 10 раз по 50 мс будет достаточно времени? Могу ли я программно выяснить, что мешает мне получить доступ к файлу? Я предполагаю, что это мое приложение (больше ничего не работает — это выделенный панельный ПК). — rossmcm 19 авг., 2011 в 07:44
  • Не думаю, что вы можете понять причину. Но просто для теста — увеличьте задержку и посмотрите, действительно ли это поможет. Это может быть где-то ослабленная ручка. Кстати, иногда в Windows вам нужно перезагрузить компьютер, чтобы разблокировать файл 🙂 — Рихо, 19 августа 2011 г., 7:59
  • Но файл не заблокирован. Как показывает журнал Process Monitor, я могу успешно открыть его, записать в него и закрыть сразу после неудачного переименования. Попробую задержку побольше. — rossmcm 19 авг. ’11 в 8:25
  • @rossmcm: если проводник процесса может сделать это за вас (как предложил Glenn1234), это должно быть возможно сделать программно … Когда мы сталкиваемся с такой проблемой, мы используем инструмент под названием handle.exe, чтобы регистрировать, кто держит файл открытым. Не знаю, откуда это, извините. — Марьян Венема, 19 августа 2011 г., 8:40
  • Задержка, вероятно, ни к чему не приведет. Файловая система обычно не так медленно закрывает дескриптор файла. И возможность открывать, читать и писать в файл не означает, что он не «заблокирован» при переименовании. — Nat 19 авг., В 8:43
| показать 3 дополнительных комментария

Поможет ли вам повторить переименование примерно через секунду? Возможно, Windows слишком медленная, чтобы догнать.


0

Стоит отметить, что файлы .DAT проверяются некоторыми антивирусными программами.. Поэтому вы можете обнаружить, что вы закрываете файл, затем AV открывает его для сканирования, и пока он еще открыт, вы пытаетесь с ним работать. Конечно, вы не можете, так как AV открыт.

Поделиться
Улучшите этот ответ
ответил 19 августа 2011 в 8:22
  • Антивирусный сканер не установлен. — rossmcm 19 авг., 2011, в 8:26
  • 1
    А что насчет основного средства защиты от вредоносных программ от Microsoft? Это меня недавно укусило при копировании файлов. Ах да, а почему у вас нет антивирусного сканера? Рисковать, что ваш продукт будет заражен вирусом, будет безответственно! 😎 — mj2008, 19 авг., 2011 в 8:39
добавить комментарий |

Стоит отметить, что файлы .DAT проверяются некоторыми антивирусными программами. Поэтому вы можете обнаружить, что вы закрываете файл, затем AV открывает его для сканирования, и пока он еще открыт, вы пытаетесь с ним работать. Конечно, вы не можете, поскольку он открыт.

Оцените статью
Botgadget.ru
Добавить комментарий