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