![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать, завершено ли копирование файла? [D5, Win2k]
SSCha © (2003-03-11 15:52:00)Во входной каталог сторонняя программа периодически копирует файлы, которые мне необходимо считать и удалить. Как узнать, завершено ли копирование конкретного файла?
Юрий Зотов (2003-03-13 23:36:00) [1]Еще вариант для NT (хотя и не слишком хороший, потому что именно по косвенным признакам) - уведомления FILE_NOTIFY_CHANGE_SIZE не приходят в течение заданного времени (проставляется в WaitForSingleObject и результат проверяется на WAIT_TIMEOUT). При надлежещем выборе периода ожидания это означает, что копирование файла закончено.
Юрий Зотов (2003-03-13 21:46:00) [2]Под 9х уведомление приходит в момент закрытия файла (видимо, это то, что Вам и нужно). Под NT может приходить в момент его изменения (то есть, при каждой модификации, еще до закрытия). Но под NT может помочь дополнительная информация от ReadDirectoryChangesW, посмотрите ее в справке.
Если все это не поможет - см. исходники FileMon на www.sysinternals.com. Там динамически грузится свой драйвер и можно отследить процесс на более низком уровне.
Suntechnic (2003-03-13 15:28:00) [3]>SSCha
Тебе ж сказали что однозначно определить завершение копирования файла под Win 2000 невозможно (для Win 98 вроде можно, но я лично не проверял). Тут около года назад по этому поводу здоровенный флейм был с тестами и примерами. Об его итогах тебе уже сообщили.
SSCha (2003-03-13 14:53:00) [4]
> Юрий Зотов
Воспользовался Вашим советом. В качестве фильтра указал только FILE_NOTIFY_CHANGE_SIZE, поскольку в описании сказано, что обнаружение изменения размера происходит только, если файл записан на диск. Но на практике уведомление приходит, когда файл только начинает копироваться. Сделал файл побольше, положил в нужный каталог - копирование еще не завершилось, а программа уже выбросила сообщение "Не могу открыть файл". Как бы мне отследить завершение изменений, а не их начало?
И еще не два странных момента:
1. не всегда срабатывает - иногда кладу файл, и ничего не происходит.
2. если в каталоге уже был файл, я его удаляю - уведомление об изменении размера не приходит. Почему?
SSCha (2003-03-12 12:07:00) [5]
> Юрий Зотов
Спасибо. Похоже, это то что нужно.
Юрий Зотов (2003-03-12 00:07:00) [6]> SSCha (11.03.03 17:13)
Расшифровываю:
FindFirstChangeNotification
FindNextChangeNotification
FindCloseChangeNotification
К поиску файлов никакого отношения не имеют. Позволяют получать уведомления о некоторых файловых операциях. Использовать надо в дополнительном потоке совместно с WaitForSingleObject. Описание см. в справке API.
SSCha (2003-03-11 17:29:00) [7]Повлиять на другую программу нельзя. Возможен вариант, когда файлы кладет администратор "ручками".
Может возможен кокой-нибудь иной подход, по коственным признакам? Если кто сталкивался, помогите.
Anatoly Podgoretsky (2003-03-11 17:17:00) [8]Одназначно определить закончилось копирование или нет невозможнл.
А повлиять на другую программу можно как нибудь.
SSCha (2003-03-11 17:13:00) [9]Юрию Зотову
FindFirst найдет файл независимо от того завершилось ли его копирование или нет. В TSearchRec ( включая FindData: TWin32FindData;) об этом тоже ни слова. Если начинаю обрабатывать файл, копирование которого не завершено - лезут ошибки. Что за функция ChangeNotification? Где лежит, что умеет? Описания не нашел.
Странно - казалось бы, задача должна быть довольно распространенная, но 2 дня пытался найти хоть что нибудь в инете - ничего. То ли искать не умею, то ли ответ прост и не обсуждается.
Юрий Зотов (2003-03-11 16:17:00) [10]См. FindFirst/Next/CloseChangeNotification.
Под линейкой NT дополнительно можно использовать ReadDirectoryChanges (если потребуется).