Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/30: Рейтинг темы: голосов - 30, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 57

Параллельное копирование файлов в два потока

21.01.2014, 18:59. Показов 6409. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите разобраться с потоками, а конкретно с использованием backgroundworker .
Нужно копировать файлы из двух папок параллельно, т.е. в два потока.
Правильно ли я понимаю?
:
создаю два backgroundworker , далее в событии DoWork для каждого из backgroundworker пишу копирование файлов из папки. И далее просто запускаю их по нажатию на кнопку

C#
1
2
 backgroundWorker1.RunWorkerAsync();
 backgroundWorker2.RunWorkerAsync();
Так можно делать ?)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.01.2014, 18:59
Ответы с готовыми решениями:

Выполнить параллельное копирование нескольких файлов
Задание такое! Написать программу, которая исполняет параллельное копирование нескольких файлов с помощью операции чтения\записи...

Параллельное копирование двух файлов через потоки
Написать программу, которая исполняет параллельное копирование нескольких файлов с помощью операции чтения\записи свойств и методов ...

Два потока в одном процессе, конфликт чтения/записи файлов
Пробую вникнуть в многопоточность. Хочу написать программу которая создает два потока, которые открывают метод Reader и метод Writer...

13
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
21.01.2014, 19:10
А при чем тут потоки? Параллельно копировать ведь можно и в основном потоке приложения...
Или Вам обязательно с потоками надо?
0
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 57
21.01.2014, 19:36  [ТС]
Ну да, желательно с потоками...

Добавлено через 5 минут
Вот копирование у меня сделано таким образом

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
foreach (FileInfo file in files1)
                        {
 
                            File.Move(in_kt + file.Name, out + file.Name);
                            int kk = files1.Length;
                      
                            progressBar1.Value = m + 1;
                            progressBar1.Refresh();
 
                            m++;
 
                            double xx = ((double)(m) / kk) * 100.0;
 
                            label1.Text = " скопировано файлов - " + m.ToString() + " из " + kk.ToString();
                            label1.Refresh();
 
                            label3.Text = xx.ToString("N0") + "%";
                            label3.Refresh();
                                                     
                        }
 
                        // Копирование из 2й папки
                        foreach (FileInfo file in files2)
                        {
                            File.Move(in_kvnt + file.Name, out + file.Name);
 
                            int k = files2.Length;
                            progressBar2.Value = n + 1;
                       
                            progressBar2.Refresh();
                            n++;
                            double proc = ((double)(n) / k) * 100.0;
                            label4.Text = proc.ToString("N0") + "%";
                            label4.Refresh();
 
                          
                            label2.Text = " скопировано файлов - " + n.ToString() + " из " + k.ToString();
                            label2.Refresh();
                           
                        }
Сначала из одной папки , потом из другой. А как сделать их параллельно в основном потоке ?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
21.01.2014, 20:00
Ну для начала, это копирование?
C#
1
File.Move(in_kvnt + file.Name, out + file.Name);
На мой взгляд, больше на перемещение похоже... А раз перемещение, то так или иначе надо дожидаться завершения одной операции и приступать к другой...
0
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 57
21.01.2014, 20:47  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Ну для начала, это копирование?
C#
1
File.Move(in_kvnt + file.Name, out + file.Name);
На мой взгляд, больше на перемещение похоже... А раз перемещение, то так или иначе надо дожидаться завершения одной операции и приступать к другой...
упс..ну да перемещение... А какая принципиальная разница копирую я или перемещаю ?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
21.01.2014, 20:56
Цитата Сообщение от Boo112 Посмотреть сообщение
упс..ну да перемещение... А какая принципиальная разница копирую я или перемещаю ?
А сами не понимаете? При копировании можно сразу в несколько мест скопировать (ну даже в Windows попробуйте). А переместить одновременно пробовали?
0
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 57
21.01.2014, 21:04  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
А сами не понимаете? При копировании можно сразу в несколько мест скопировать (ну даже в Windows попробуйте). А переместить одновременно пробовали?
Нет, ну это я понимаю, но каким образом это влияет на конкретно мой случай ? Мну нужно просто одновременно переместить файла из папки 1 в папку 2 и из 3 в папку 4 и все...Я думаю тут без разницы копирую я файлы или перемещаю.Или я что-то не догоняю.
м.б. я как то не правильно сформулировал вопрос в первом посте...
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
21.01.2014, 21:06
Так у Вас разные файлы или те же самые? Если разные-это возможно, если одни и те же - то нет.
0
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 57
21.01.2014, 21:16  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Так у Вас разные файлы или те же самые? Если разные-это возможно, если одни и те же - то нет.
Разные
сформулирую по -другому:
есть папка 1 в ней есть файлы: 1.txt,2.txt,3.txt
есть папка 2 в ней есть файлы: 4.txt,5.txt,6.txt
и есть две пустых папки 3,4

Нужно из папки 1 все три файла скинуть в папку 3, а из папки 2 в папку 4.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
21.01.2014, 21:25
Организуйте пару bool функций с аргументами для копирования, запустите в 2 потока и ждите, как получите true от них.

Добавлено через 5 минут
Хотя нет, если через Thread, то еще проще, проверять ThreadState, и никакие функции не нужны. Пара обычных методов.
0
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 57
21.01.2014, 21:48  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Добавлено через 5 минут
Хотя нет, если через Thread, то еще проще, проверять ThreadState, и никакие функции не нужны. Пара обычных методов.
покажи как это?
я просто думал сделать , что то типо такого :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public Form1()
        {
            InitializeComponent();
 
            BackgroundWorker backgroundWorker1 = new BackgroundWorker(); //Создаем поток1
            backgroundWorker1.DoWork += new DoWorkEventHandler(DoWork); //Подписываемся на событие нового потока
            backgroundWorker1.RunWorkerAsync(); //Вызываем события
 
BackgroundWorker backgroundWorker2 = new BackgroundWorker(); //Создаем поток2
            backgroundWorker2.DoWork += new DoWorkEventHandler(DoWork); //Подписываемся на событие нового потока
            backgroundWorker2.RunWorkerAsync(); //Вызываем события
        }
 
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
 
            foreach (FileInfo dir in file)
            {
 
                CopyFile(FullName1, FileName3);
                progressBar1.Value++;
 
            }
        }
 private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
 
            foreach (FileInfo dir in file)
            {
 
                CopyFile(FullName2, FileName4);
                progressBar2.Value++;
 
            }
        }
Но не знаю на сколько это правильно.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
21.01.2014, 23:12
Вот честно скажу, никогда не применял backgroundWorker для потоков. Еще с VB.NET привычка, большую часть писать в коде, так удобнее, видно что есть а чего нет...
Если в самом упрощеном варианте, то вот 2 потока, запускаются и работают. По нажатию клавиши они прерываются.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication1
{
    class Program
    {
        
        public static void Main()
        {
            Thread t1 = new Thread(work1);
            Thread t2 = new Thread(work2);
            t1.Name = "Поток 1";
            t2.Name = "Поток 2";
 
            t1.Start();
            t2.Start();
 
            Console.WriteLine("Нажмите клавишу для прерывания потоков...");
            Console.ReadLine();
 
            if ((t1.ThreadState & ThreadState.Running) == ThreadState.Running)
                t1.Abort();
            if ((t2.ThreadState & ThreadState.Running) == ThreadState.Running)
                t2.Abort();
 
            
 
        }
        private static void work1()
        {
            for (int i = 0; i <= 1000; i++)
            {
                Thread.Sleep(500);
                Console.WriteLine("Thread 1 is running: "+Thread.CurrentThread.Name);
                Console.WriteLine("\n");
            }
                
        }
        private static void work2()
        {
            for (int i = 0; i <= 1000; i++)
            {
                Thread.Sleep(500);
                Console.WriteLine("Thread 2 is running: " + Thread.CurrentThread.Name);
                Console.WriteLine("\n");
            }
 
        }
    }
}
1
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 57
22.01.2014, 15:45  [ТС]
Спасибо с потоками попробую...
А все-таки на счет конкретно backgroundworker у кто - нибудь есть мысли ?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
22.01.2014, 15:49
http://msdn.microsoft.com/ru-r... .110).aspx
На мой взгляд, все то же самое, только сделано для упрощения труда. Мне привычнее ручками.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.01.2014, 15:49
Помогаю со студенческими работами здесь

Два потока, две очереди, два потока
Есть две очереди. Каждая из них заполняется своим потоком. Есть два потока, которые достают данные из своей очереди. Но когда одна из...

Чтение теста из файлов в Java. java коллекции, потоки. создать приложение, в котором будет два отдельных потока
Создайте два текстовых файла с именами, например, countries.txt и capitals.txt. В первом файле должны быть перечислены названия стран,...

Параллельное скачивание файлов
Здравствуйте, хочу распараллелить скачивание файлов по ссылкам из списка, чтобы одновременно загружались сразу 3, например (то есть после...

Параллельное скачивание файлов
Стоит задача отдать по клику клиенту набор картинок. Но возможно из-за малого опыта работы с HTML заголовками, или из-за ограничений...

Параллельное чтение из txt файлов
Понадобилось воспользоваться параллельным чтением n текстовых файлов. Как можно реализовать?


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника Номенклатура по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор под наименованию группы (на. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника Сотрудники по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru