Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с 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]

Мало кода


Наверх

Титульная страница Поиск, карта сайта Написать письмо