Как узнать, что файл закончил копирование - PullRequest
2 голосов
/ 18 февраля 2009

Я использую ReadDirectoryChangesW, чтобы шпионить папку, если я копирую большой файл в папку, я могу получить несколько сообщений FILE_ACTION_MODIFIED, кажется, что каждый раз, когда Windows записывает большой кусок файла, вы получаете измененный файл уведомление за каждый раз. Я пытался использовать API CreateFile, чтобы проверить, может ли файл открываться точкой доступа или нет, но иногда некоторые файлы всегда блокируются другой точкой доступа, например, если вы открываете Outlook, PST обновляется, но моя точка доступа может Чтобы получить к нему доступ, мы должны запустить Shadow Copy, чтобы открыть его. Итак, мой вопрос, как узнать, что файл закончил копирование?

Ответы [ 3 ]

1 голос
/ 18 февраля 2009

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

РЕДАКТИРОВАТЬ: Это не оптимальное решение в среднем случае, но учтите, что в случае ОП лучшие решения исключаются из-за проблемных ограничений. Подумайте об этом, прежде чем думать о снижении голосов.

0 голосов
/ 14 мая 2014

Windows предоставляет API для мониторинга обновления содержимого каталога. Вы можете использовать событие Created для обнаружения нового файла, но имейте в виду, что запуск этого события не обязательно означает, что файл еще не выпущен.

спецификации C ++ и пример кода:

http://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx

.net:

http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

0 голосов
/ 07 мая 2011

Когда вы запрашиваете размер файла, не используйте _stat/_stat64. Вместо этого открывайте файл каждый раз, когда вам нужно, и вызывайте _filelengthi64, чтобы узнать размер файла. Размер файла, возвращаемый _stat64, не обновляется в реальном времени операционной системой Windows. Кроме того, открывая файл, вы проверяете, что все длительные операции копирования были завершены.

...