Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-46763
Denizzz
2003-04-30 22:04
2003.05.15
ярлык для DOS приложения


14-46922
sniknik
2003-04-25 08:53
2003.05.15
Кто понимает эту бредовую ситуацию?


1-46788
Начинака
2003-05-01 13:34
2003.05.15
ListView в runtime ...


14-47007
Zilog
2003-04-28 15:45
2003.05.15
Как можно организовать TimeOut?


4-47042
Pattern
2003-03-16 12:41
2003.05.15
GetVersionEx





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский