Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-68279
Vt
2003-08-07 07:13
2003.08.21
Как в StringGrid очистить сразу все строки


1-68307
Eugene_P
2003-08-06 15:22
2003.08.21
DDE -> VB -> MS WORD ?


14-68484
Vlad Oshin
2003-08-06 09:08
2003.08.21
о как бывает :)


1-68284
Fantasy
2003-08-07 03:39
2003.08.21
КАК


14-68511
Dimka Maslov
2003-08-04 16:31
2003.08.21
Арабы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский