![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с ProgressBar и копированием файлов под XP...
Борис К. © (2003-06-18 11:17:00)Здравствуйте, уважаемые! Вот уже месяц никто не может ничего путного посоветовать по моей проблеме - при копировании большого файла по сети, приведенной ниже функцией, 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 -----------------------------
Song (2003-06-18 17:59:00) [1]
А может CopyFileEx() ?
Игорь Шевченко (2003-06-18 17:31:00) [2]
Борис К. (18.06.03 17:24)
> Или никому неохота разбираться в дебрях ОС или чужих проблемах?
> Тогда зачем форум?
http://ln.com.ua/~openxs/articles/smart-questions-ru.html(там написано, зачем форум)
Борис К. (2003-06-18 17:24:00) [3]
Спасибо всем, особенно clickmaker-у (его идея относительно Flags) но остальным так трудно было написАть пару строк типа "проблема в lazy flush"? Или никому неохота разбираться в дебрях ОС или чужих проблемах? Тогда зачем форум?
Thanx all ;)
Poirot (2003-06-18 14:17:00) [4]
> CreateFile не подходит мне по многим причинам!
Ну типа человек не хочет страдать!!!!!
А по вопросу - создай класс - наследник потока и ему событие зафигач - типа обработан один (сколькото) байт и при работе этого потока используй это событие для отрисовки из апликейшена. В потоке естественно читай что тебе надо... Только надо будет подумать о синхронизации...
clickmaker (2003-06-18 13:43:00) [5]
CreateFile не подходит мне по многим причинам!
Так вы его уже используете! :) Ф-ия VCL FileCreate вызывает виндозную CreateFile. Не верите, загляните в Source\Rtl\Sys\Sysutils.pas
И по каким таким причинам он вам не угодил?
Борис К. (2003-06-18 13:29:00) [6]
To Шевченко: Что значит "Мало кода"? Тут все работает! Проблема не в этомкоде, а в том, что в нем чего-то не хватает чтобы запретить Windows XP делать отложенную запись! Он всю эту процедуру пробегает сразуи говорит моей проге, что, мол, скопировали уже файл, а сам тем временем его втихаря шлет !!! КАК побороть?
To clickmaker:
CreateFile не подходит мне по многим причинам!
Ну, мастера, помогите же в конце-то концов... Достала эта проблема :)
clickmaker (2003-06-18 12:35:00) [7]
открыть его с помощью CreateFile с dwFlagsAndAttributes = FILE_FLAG_WRITE_THROUGH
Игорь Шевченко (2003-06-18 12:34:00) [8]
Мало кода