Главная страница
    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.157 c
14-68541
Халява
2003-08-04 23:41
2003.08.21
WebBrowser


14-68486
Jumbo
2003-08-05 20:20
2003.08.21
Из Си - в Паскаль


6-68430
k$v
2003-06-15 21:41
2003.08.21
Нужен простейший пример использования INDY ...


4-68594
SergeyI
2003-06-20 11:26
2003.08.21
Работа с файлами


14-68485
Работодатель
2003-07-29 15:18
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский