Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 22.02.2018
Сообщений: 6

Многопоточное копирование одного или группы файлов

23.07.2018, 09:16. Показов 6086. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! у меня вопрос по поводу многопточного копирования файлов в WinForms. Я написал код копирования файлов https://drive.google.com/open?... yA6GPvOUnE,
теперь мне необходимо его в многопоточное копирование превратить, правда сам не знаю как А также Построить зависимость скорости копирования от размера внутреннего буфера памяти (512, 1024, 2048, 4096, 16*1024, 64*1024, 256*1024 байт, 1Мбайт, 4 Мбайт, 16 Мбайт, 32 Мбайт ). Помоготи плиииз...
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.07.2018, 09:16
Ответы с готовыми решениями:

Многопоточное копирование файлов
Здравствуйте, уважаемые форумчане! Суть задания такова: необходимо скопировать заданный файл используя заданное количество потоков...

Многопоточное копирование файлов
Пишу небольшую утилитку, которая собой представляет грабер флешки. На данный момент сделал определение подключения флешки, создание списка...

Копирование отсутствующих и изменённых файлов по результатам сверки файлов одного каталога с файлами другого
Всем привет. такая вот задача у меня. я не селен в этом. но стараюсь. есть 2 каталога (1. NEW, 2. CLONE)с файлами в один из них время от...

13
 Аватар для PoPsa85
814 / 561 / 240
Регистрация: 01.07.2018
Сообщений: 1,818
23.07.2018, 09:33
Ну так используйте асинхронные методы.
C#
1
2
3
4
5
6
public static async Task fileCopyAsync(string srcFile, string dstFile, int bufferSize)
        {
            using (var srcStream = new FileStream(srcFile, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.Asynchronous | FileOptions.SequentialScan))
            using (var dstStream = new FileStream(dstFile, FileMode.CreateNew, FileAccess.Write, FileShare.None, bufferSize, FileOptions.Asynchronous | FileOptions.SequentialScan))
                await srcStream.CopyToAsync(dstStream);
        }
0
0 / 0 / 0
Регистрация: 22.02.2018
Сообщений: 6
23.07.2018, 09:46  [ТС]
Спасибо за ответ! Т.е. мне необходимо вместо моего метода CopyFile(), использовать асинхронные методы которые вы скинули?
0
 Аватар для PoPsa85
814 / 561 / 240
Регистрация: 01.07.2018
Сообщений: 1,818
23.07.2018, 09:54
Salamvsem, Да. И вызывать через task.wait()
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.07.2018, 10:17
Цитата Сообщение от PoPsa85 Посмотреть сообщение
Ну так используйте асинхронные методы.
Цитата Сообщение от PoPsa85 Посмотреть сообщение
И вызывать через task.wait()
Пара проблем у такого подхода:
1. Не показывается прогресс.
2. Раскручивается поток только для того, чтобы ждать завершения асинхронной операции, т.е. отпадает необходимость в асинхронном методе.
0
 Аватар для PoPsa85
814 / 561 / 240
Регистрация: 01.07.2018
Сообщений: 1,818
23.07.2018, 11:01
kolorotur, Покажите ваш способ ?

Добавлено через 38 минут
Еще способ через делегат. Код не мой. Подсмотрел.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class AsyncFileCopier
    {
        public delegate void FileCopyDelegate(string sourceFile, string destFile);
 
        public static void AsynFileCopy(string sourceFile, string destFile)
        {
            FileCopyDelegate del = new FileCopyDelegate(FileCopy);
            IAsyncResult result = del.BeginInvoke(sourceFile, destFile, CallBackAfterFileCopied, null);
        }
 
        public static void FileCopy(string sourceFile, string destFile)
        {
            File.Copy(sourceFile, destFile);
        }
 
        public static void CallBackAfterFileCopied(IAsyncResult result)
        {
            // Code to be run after file copy is done
        }
    }
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.07.2018, 11:21
Цитата Сообщение от PoPsa85 Посмотреть сообщение
Покажите ваш способ ?
У автора уже нормальный способ.
Немного причесать код и пару багов исправить и будет вполне кошерно.
0
0 / 0 / 0
Регистрация: 22.02.2018
Сообщений: 6
23.07.2018, 15:07  [ТС]
Добавлено через 1 минуту
Подскажите как причесать код и исправить пару багов?

Добавлено через 2 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
У автора уже нормальный способ.
Немного причесать код и пару багов исправить и будет вполне кошерно.
Подскажите как можно причесать код и исправить пару багов?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.07.2018, 16:05
Лучший ответ Сообщение было отмечено Salamvsem как решение

Решение

Цитата Сообщение от Salamvsem Посмотреть сообщение
Подскажите как можно причесать код и исправить пару багов?
  • Такие элементы, как BackgroundWorker, FolderBrowserDialog и OpenFileDialog можно добавить на форму в качестве компонентов через дизайнер. Там же их и инициализировать и привязать к событиям — код в форме будет чище.
  • В методе CopyFile неплохо было бы потоки обернуть в using, чтобы при возникновении исключения файлы не висели замкнутыми до следующих пары сборок мусора.
  • При возникновении исключения во время копирования так же было бы неплохо удалять не до конца скопированный файл из папки назначения.
  • Нет смысла обновлять прогресс на каждой итерации — если будет копироваться большой файл с маленьким буфером, то основную часть времени вы будете заниматься обновлением прогресса без его обновления. Обновляйте его тогда, когда процент увеличивается на единицу или выше.
  • В методе Worker_RunWorkerCompleted первым делом проверяйте свойство Error второго параметра, а потом уже Cancelled. Если делать как у вас, то при ошибке копирования у вас упадет все приложение
  • Используйте Path.Combine для построения полного пути к файлу, вместо конкатенации с символом "".
  • Зачем вам поля inputFile и outputFile, если пути уже хранятся в текстбоксах?
  • Если я введу путь к файлу в текстбокс вручную или скопирую, то программа этого не поймет, т.к. свойства полям присваиваются при нажатии на кнопку выбора файла. Еще один аргумент в пользу удаления этих полей.
  • Поскольку вам по заданию надо использовать разные размеры буферов, это значение можно передавать при вызове RunWorkerAsync — оно будет доступно в методе CopyFile в последнем параметре (свойство Argument). Сейчас у вас размер буфера жестко прописан в коде.
2
0 / 0 / 0
Регистрация: 22.02.2018
Сообщений: 6
23.07.2018, 18:11  [ТС]
Спасибо за ваши советы!!! я почти разобрался со всеми вашими наставлениями. вот только вопрос по поводу того что в методе CopyFile неплохо было бы потоки обернуть в using, как это произвести? я вот хотел обернуть их, вот только в проверке выходят ошибочки, как правильно эти потоки обернуть? Буду очень благодарен вам!!!!
private void CopyFile(string source, string destination, DoWorkEventArgs e)
{
using (FileStream fsOut = new FileStream(destination, FileMode.Create))
using (FileStream fsIn = new FileStream(source, FileMode.Open)) ;
byte[] buffer = new byte[4096];
int readBytes;
while ((readBytes = fsIn.Read(buffer, 0, buffer.Length)) > 0)\\ здесь не видит fsIn - пишет не существует в текущем контексте...
{
if (worker.CancellationPending)
{
e.Cancel = true;
worker.ReportProgress(0);

return;
}
else
{
fsOut.Write(buffer, 0, readBytes);\\ и здесь также fsOut не видит...
float prog = fsIn.Position * 100 / fsIn.Length;
worker.ReportProgress((int)prog);

}
}

}
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.07.2018, 19:09
Цитата Сообщение от Salamvsem Посмотреть сообщение
как это произвести?
C#
1
2
3
4
5
using (FileStream fsOut = new FileStream(destination, FileMode.Create))
using (FileStream fsIn = new FileStream(source, FileMode.Open)) 
{
   // Тут остальной код метода.
}
Не забудьте во второй строчке убрать в конце ";".
0
0 / 0 / 0
Регистрация: 22.02.2018
Сообщений: 6
23.07.2018, 20:53  [ТС]
Спасибо за ответ!!! Я уже наверное надоел вам, но последний вопрос по поводу передачи значения при вызове RunWorkerAsync(). я вот накидал кода посмотрите пожалуйста... я снизу подгрузил файл Многтпоточное копирование.txt
0
Эксперт .NET
 Аватар для Rius
13233 / 7729 / 1680
Регистрация: 25.05.2015
Сообщений: 23,548
Записей в блоге: 14
24.07.2018, 06:23
Цитата Сообщение от Salamvsem Посмотреть сообщение
Построить зависимость скорости копирования от размера внутреннего буфера памяти
Там есть ещё варианты:
Миниатюры
Многопоточное копирование одного или группы файлов  
0
0 / 0 / 0
Регистрация: 22.02.2018
Сообщений: 6
24.07.2018, 09:59  [ТС]
kolorotur, Спасибо за ответ!!! Я уже наверное надоел вам, но последний вопрос по поводу передачи значения при вызове RunWorkerAsync(). я вот накидал кода посмотрите пожалуйста... я снизу подгрузил файл Многтпоточное копирование.txt
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.07.2018, 09:59
Помогаю со студенческими работами здесь

Копирование группы файлов по заданным путям
Добрый день! Подскажите пожалуйста в чем ошибка и где нужно что добавить? Суть вопроса. В Memo1 загружается список(по кнопке Button2)...

Копирование файлов из группы каталогов в несколько потоков
Добрый день.С потоками дел никогда не имел. Помогите пожалуйста сделать задачку небольшую: Обеспечить копирование файлов из группы...

Перехват события на копирование/перемещение файла/группы файлов
Всем привет. В общем, проблема следующая: Необходимо написать программу, которая шифровала бы файлы по алгоритму AES при копировании...

Копирование файлов с одного диска на другой
Задача: Программа копирует файлы с одного диска на другой. Запросы на копирование поступают в случайные моменты времени, интервал между...

копирование файлов из одного каталога в другую
Возможно ли написать такой .bat файл который копирует файлы из одного каталога в другую и при этом выполняя это действие АВТОМАТИЧЕСКИ и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru