Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.22;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.022 c
14-70012
AndreyK
2002-03-13 11:19
2002.04.22
Помогите


1-69882
koks
2002-04-05 15:26
2002.04.22
Подскажите, где можно найти хорошие коллекции битмапов...


3-69753
xmapa
2002-04-02 16:16
2002.04.22
Выборка из Stored Procedure в FIB+


1-69917
cok
2002-03-30 14:55
2002.04.22
Pascal срочно, плзззз...


3-69738
Potok
2002-04-02 05:43
2002.04.22
Данные