Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];

Вниз

как определить- закончена перекачка файла или нет?   Найти похожие ветки 

 
Suntechnic   (2002-03-13 21:39) [41]

>Юрий Зотов © (13.03.02 18:53)
Ок. Конструктивные, так конструктивные :)

Всё, что я буду дальше говорить будет относиться к вот такой конструкции записии в файл:

HANDLE hf = CreateFile("C:\\temp\\file.dat", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL);
SetFilePointer(hf, total_file_size, 0, FILE_BEGIN);
SetEndOfFile(hf);
SetFilePointer(hf, 0, 0, FILE_BEGIN);
...
WriteFile(hf,...); // здесь происходят многократные вызовы WriteFile в цикле
...
CloseHandle(hf);


На практике файлы именно так и копируются, если Вы понаблюдаете за Explorer-ом то Вы со мной должны согласится.

Наша задача: Определить в какой момент произойдёт запись последнего байта с данными файл. Теоретически это событие должно произойти на строчке CloseHandle(hf);

Про Win98/ME сказать ничего не могу. Вынужден Вам поверить потому как на работе Win2000, дома XP, у тестеров конечно могу поросить потестить на Win98, но боюсь что меня не поймут :)

Итак с Win98 пытаемся разобраться с 2000. Пробуем вариант предложенный panov-ым © (13.03.02 17:21) с FILE_NOTIFY_CHANGE_LAST_ACCESS. Запускаем тестовый пример который использует FindFirstChangeNotification и получаем уведомление об изменении на каждый вызов WriteFile!!! Как Вы понимаете это решение к условиям нашей задачи не подходит.
Зупускаем тестовый пример с использованием ReadDirectoryChangesW. Получаем два уведомления: первое на CreateFile второе на CloseHandle. Определить какое из них к чему относится по-моему не представляется возможным, так как оба раза мы получаем сообщение, что файл был модифицирован и всё. Можно конечно пофантазировать, что после вызова CreateFile его размер ещё равен 0, а на CloseHandle уже имеется реальный размер, но а что если файл уже существует и он не нулевого размера? Как тогда? (Ксати тут по этому поводу даже баг имеется(MSDN Q245214) и второе сообщение, то, что после CloseHandle, можно вообще умудриться не получить. У меня это пару раз получилось.)
Использование всех остальных параметров в ReadDirectoryChangesW тоже приводит ещё к худщим результатам. По крайней мере мне не удалось получить одно единственное сообщение после CloseHandle.
Как же решить проблему? Наиболее перспективным мне как раз представляется комбинация метода с использованием FindFirstChangeNotification с параметром FILE_NOTIFY_CHANGE_LAST_WRITE и методом предложенным Shaman_Naydak © (11.03.02 12:07). Дело в том, что FindFirstChangeNotification с параметром FILE_NOTIFY_CHANGE_LAST_WRITE для 98(полагаюсь на Вас) будет вызываться только по окончании процесса копирования, а для Win2000 2 раза: после SetEndOfFile и после CloseHandle. Но после первого раза, файл открыть мы просто не сможем, а второй раз будет тот который нам нужен.... Вообщем вот такие рассуждения... Честно говоря ковырятся в этом больше желания нет, работа стоит... за сим и прошу откланяться :)




Страницы: 1 2 вся ветка

Форум: "Потрепаться";
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.007 c
1-69768
JokerJ
2002-04-10 06:05
2002.04.22
TWebBrowser :: автозаполнение форм


3-69669
kserg@ukr.net
2002-04-03 12:17
2002.04.22
ADOQuery- как правильно работать с параметриз.запросом


1-69806
MystiX
2002-04-09 18:32
2002.04.22
Help with mouse


14-69993
Knight
2002-03-14 19:12
2002.04.22
логика не фурычит...черта Шеффера


1-69868
VAleksey
2002-04-09 08:54
2002.04.22
Копирование каталогов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский