Форум: "Потрепаться";
Текущий архив: 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