Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Прогресс копирования файла(ов)


Автор: XavierElf 28.4.2007, 16:00
Сделал прогу-апдейтер, которая проверяет сервер на наличие обновлений для другой программы. Возникла проблема с получением прогресса копирования файла. Ну нету вот у метода File.Copy(...) в нэймспэйсе System.IO возможности установить callback функцию, как это к примеру реализовано в WinAPI функцией CopyFileEx(...). Кто-нибудь знает, как можно получить этот прогресс в .NET без непосредственного вызова функций WinAPI?

Автор: Sartorius 28.4.2007, 16:16
 Замеряй размер dest-файла на таймере smile 

Автор: XavierElf 28.4.2007, 16:24
Цитата(Sartorius @ 28.4.2007,  16:16)
Замеряй размер dest-файла на таймере smile

Рационально ли это? Неужели нету методов асинхронного копирования с вызовом callback функций?

Автор: Naum 28.4.2007, 16:48
Сомневаюсь, что рационально, но когда-то давно для проверки скорости сд-рома делал так, копировал по байтам smile. Т.е. создаешь dest-файл. Потом в цикле читаешь несколько байт из сорца и записываешь в дест. И всегда знаешь сколько уже скопировано.
Цитата(XavierElf @  28.4.2007,  17:00 Найти цитируемый пост)
как это к примеру реализовано в WinAPI функцией CopyFileEx(...)

А что мешает вызывать эту функцию?

Автор: Stepan_Lameroff 28.4.2007, 17:36
Думаю, Вам будет интересно.
http://research.microsoft.com/research/pubs/view.aspx?tr_id=841
http://research.microsoft.com/research/downloads/Details/a6f86a1e-0278-4c72-9300-f747251c3bf0/Details.aspx

Автор: tol05 29.4.2007, 11:14
Так сделай отдельный поток, запускай там File.Copy(), когда отработает, вызывай какую-нибудь функцию - она будет выполнять типа callback-а.
Все асинхронные операции так же устроены, только поток среда сама создает.

Автор: Stepan_Lameroff 29.4.2007, 13:56
tol05 а можно поподробнее, plz.
Я всю жизнь думал (и делал), что прогресс копирования можно отобразить
или используя WinAPI CopyFileEx, или ручками реализовывая копирование через FileStream.
 smile

Автор: tol05 29.4.2007, 15:30
Сделал в двух рабочих потоках. 
Копирование и callback - без проблем, а вот с прогрессом на реальном кол-ве байтов - получается сложновато. Не учел я что File.Size тупо финальный размер показывает.
Так что текущий размер копирующегося файла узнаю через Stream-ы. 
Так что пример наверное показывать не буду.

Автор: XavierElf 2.5.2007, 07:55
Цитата(Naum @ 28.4.2007,  16:48)
Сомневаюсь, что рационально, но когда-то давно для проверки скорости сд-рома делал так, копировал по байтам smile. Т.е. создаешь dest-файл. Потом в цикле читаешь несколько байт из сорца и записываешь в дест. И всегда знаешь сколько уже скопировано.
Цитата(XavierElf @  28.4.2007,  17:00 Найти цитируемый пост)
как это к примеру реализовано в WinAPI функцией CopyFileEx(...)

А что мешает вызывать эту функцию?

В общем, конечно, ничто не мешает... Просто я хотел узнать, можно ли проблему решить средствами .NET smile

Добавлено через 4 минуты и 40 секунд
ЗЫ. Вопрос решён,тема закрыта.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)