Форум: "WinAPI";
Текущий архив: 2003.08.21;
Скачать: [xml.tar.bz2];
ВнизПроблема с ProgressBar и копированием файлов под XP... Найти похожие ветки
← →
Борис К. (2003-06-18 11:17) [0]Здравствуйте, уважаемые! Вот уже месяц никто не может ничего путного посоветовать по моей проблеме - при копировании большого файла по сети, приведенной ниже функцией, ProgressBar махом улетает до 100%, затем начинается неторопливое копирование самого файла средствами ОС Windows XP. Под линейкой 9х - полный порядок. Как все-таки сделать так, чтобы индикатор корректно отображал ход процесса, то бишь дать XP "по рукам"? Кто-нибудь сможет помочь? Другие способы I/O - файлов (потоки, файловые переменные и т.п.) просьба не предлагать - уже все опробовал. Наилучший вариант - WinAPI.
Заранее спасибо.
Исходник (для краткости выкинуты все raise, TRY&EXCEPT):
-------------------------- begin --------------------------------
HandleFrom := FileOpen(SourceFile,fmOpenRead or fmShareDenyNone);
HandleTo := FileCreate(DestinationFile);
FileSize := GetFileSize(HandleFrom,nil);
TotalRead := 0;
FileSeek(HandleFrom,0,0);
FileSeek(HandleTo,0,0);
Repeat
Application.ProcessMessages;
BytesRead := FileRead(HandleFrom,Buffer,Size);
if BytesRead > 0
then begin
BytesWritten := FileWrite(HandleTo,Buffer,BytesRead);
Application.ProcessMessages;
if BytesRead = BytesWritten
then begin
TotalRead := TotalRead + BytesRead;
ProgressBar := Trunc((TotalRead / FileSize) * 100);
end;
end;
( HandleFrom) Здравствуйте, уважаемые! Вот уже месяц никто не может ничего путного посоветовать по моей проблеме - при копировании большого файла по сети, приведенной ниже функцией, ProgressBar махом улетает до 100%, затем начинается неторопливое копирование самого файла средствами ОС Windows XP. Под линейкой 9х - полный порядок. Как все-таки сделать так, чтобы индикатор корректно отображал ход процесса, то бишь дать XP "по рукам"? Кто-нибудь сможет помочь? Другие способы I/O - файлов (потоки, файловые переменные и т.п.) просьба не предлагать - уже все опробовал. Наилучший вариант - WinAPI.
Заранее спасибо.
Исходник (для краткости выкинуты все raise, TRY&EXCEPT):
-------------------------- begin --------------------------------
HandleFrom := FileOpen(SourceFile,fmOpenRead or fmShareDenyNone);
HandleTo := FileCreate(DestinationFile);
FileSize := GetFileSize(HandleFrom,nil);
TotalRead := 0;
FileSeek(HandleFrom,0,0);
FileSeek(HandleTo,0,0);
Repeat
Application.ProcessMessages;
BytesRead := FileRead(HandleFrom,Buffer,Size);
if BytesRead > 0
then begin
BytesWritten := FileWrite(HandleTo,Buffer,BytesRead);
Application.ProcessMessages;
if BytesRead = BytesWritten
then begin
TotalRead := TotalRead + BytesRead;
ProgressBar := Trunc((TotalRead / FileSize) * 100);
end;
end;
Until BytesRead = 0;
FileClose(HandleFrom);
FileClose(HandleTo);
------------------------------- end -----------------------------
← →
Игорь Шевченко (2003-06-18 12:34) [1]Мало кода
← →
clickmaker (2003-06-18 12:35) [2]открыть его с помощью CreateFile с dwFlagsAndAttributes = FILE_FLAG_WRITE_THROUGH
← →
Борис К. (2003-06-18 13:29) [3]To Шевченко: Что значит "Мало кода"? Тут все работает! Проблема не в этом коде, а в том, что в нем чего-то не хватает чтобы запретить Windows XP делать отложенную запись! Он всю эту процедуру пробегает сразу и говорит моей проге, что, мол, скопировали уже файл, а сам тем временем его втихаря шлет !!! КАК побороть?
To clickmaker:
CreateFile не подходит мне по многим причинам!
Ну, мастера, помогите же в конце-то концов... Достала эта проблема :)
← →
clickmaker (2003-06-18 13:43) [4]CreateFile не подходит мне по многим причинам!
Так вы его уже используете! :) Ф-ия VCL FileCreate вызывает виндозную CreateFile. Не верите, загляните в Source\Rtl\Sys\Sysutils.pas
И по каким таким причинам он вам не угодил?
← →
Poirot (2003-06-18 14:17) [5]
> CreateFile не подходит мне по многим причинам!
Ну типа человек не хочет страдать!!!!!
А по вопросу - создай класс - наследник потока и ему событие зафигач - типа обработан один (сколькото) байт и при работе этого потока используй это событие для отрисовки из апликейшена. В потоке естественно читай что тебе надо... Только надо будет подумать о синхронизации...
← →
Борис К. (2003-06-18 17:24) [6]Спасибо всем, особенно clickmaker-у (его идея относительно Flags) но остальным так трудно было написАть пару строк типа "проблема в lazy flush"? Или никому неохота разбираться в дебрях ОС или чужих проблемах? Тогда зачем форум?
Thanx all ;)
← →
Игорь Шевченко (2003-06-18 17:31) [7]Борис К. (18.06.03 17:24)
> Или никому неохота разбираться в дебрях ОС или чужих проблемах?
> Тогда зачем форум?
http://ln.com.ua/~openxs/articles/smart-questions-ru.html (там написано, зачем форум)
← →
Song (2003-06-18 17:59) [8]А может CopyFileEx() ?
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.08.21;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c