Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать, завершено ли копирование файла? [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 (если потребуется).


Наверх

Титульная страница Поиск, карта сайта Написать письмо