Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/55: Рейтинг темы: голосов - 55, средняя оценка - 4.69
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
1
.NET 4.x

Копирование файлов с ProgressBar без зависания программы

30.05.2017, 14:11. Показов 10658. Ответов 61
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Кто знает как можно копировать файлы с показом на прогрессбаре и без зависания прогаммы
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2017, 14:11
Ответы с готовыми решениями:

Копирование файлов с ProgressBar'om
Все привет, задачу описал в названии темы, собственно вопрос: как это реализовать? Гуглил, но...

Копирование файлов в отдельном потоке во избежание зависания приложения
При копировании файла программа полностью зависает. После завершения копирования, программа...

Копирование файлов в потоке + ProgressBar
Всем доброго времени суток. Кто может подсказать, как можно реализовать копирование файла в потоке...

Sleep без зависания программы
Как выполнить sleep без зависания программы?

61
Эксперт .NET
12078 / 8387 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
30.05.2017, 14:31 2
Alexandr_7, копировать в отдельном потоке?..
0
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
31.05.2017, 12:20  [ТС] 3
Это то понятно. Я просто незнаю как это сделать. Нужно также показывать на progressbar

Добавлено через 21 час 35 минут
Ну что кто в курсе как сделать?
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,658
Записей в блоге: 14
31.05.2017, 14:08 4
Я в курсе.
Вот тут в строках 90...119 показан этот принцип.

Не по теме:

Но если вы его там не разглядите, то мне объяснять лень.

0
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
31.05.2017, 14:25  [ТС] 5
Там вообщето скачка файла а мне не качать а копировать нужно
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,658
Записей в блоге: 14
31.05.2017, 14:27 6
В чём отличие между скачкой файла и копированием файла, если и то и другое происходит через потоки? А?
0
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
31.05.2017, 14:30  [ТС] 7
в том что скачка файла происходит через интернет и качается в нужное место а копирование нужно копировать из одного места в другое.
Во 2. В C# есть компонент backgroundWorker. Может через него можно?
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,658
Записей в блоге: 14
31.05.2017, 14:38 8
1.Что, правда? Вы-таки полагаете, что я напрасн указал код и именно эти строки? Подумайте ещё раз.
2. Можно. Только кода, оборачивающего копирование в поток будет больше.
0
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
31.05.2017, 14:47  [ТС] 9
Не разобрался я в том куске кода что вы сказали:
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
                using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())// Error here
                {
                    using (Stream responseStream = response.GetResponseStream())
                    {
                        using (FileStream destinationStream = new FileStream(filename, FileMode.Create, FileAccess.Write))
                        {
                            byte[] buffer = new byte[1024 * 16];
                            long readedTotal = 0;
 
                            Stopwatch watch = new Stopwatch();
                            watch.Start();
 
                            while (responseStream.CanRead && !token.IsCancellationRequested)
                            {
                                int readed = responseStream.Read(buffer, 0, buffer.Length);
                                destinationStream.Write(buffer, 0, readed);
 
                                readedTotal += readed;
 
                                Task.Factory.StartNew(() => this.DownloadProgress(readedTotal, size, watch.Elapsed), CancellationToken.None, TaskCreationOptions.None, this.mContextUI);
                            }
 
                            watch.Stop();
 
                            destinationStream.Flush();
                        }
                    }
 
                    response.Close();
                }
            }
0
Эксперт .NET
12078 / 8387 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
31.05.2017, 17:04 10
Что за ерунда адовая в двадцатой строке?..

Alexandr_7, погуглите статью по работе с потоками (Thread/Task) в C#, погуглите что такое стримы (Stream), что бы осознать, что это очень удобный уровень абстракции стирающий разницу между копированием файлов (FileStream), скачиванием из интернета (NetworkStream) и перемещением блоков памяти (MemoryStream).
0
Rius
31.05.2017, 17:06
  #11

Не по теме:

Usaga, ну не люблю я Control.Invoke :)

0
Usaga
31.05.2017, 17:20
  #12

Не по теме:

Rius, и потому в цикле потоки из пула дёргаете для обновления прогресса? :)

0
Rius
31.05.2017, 18:11
  #13

Не по теме:


Usaga, ну да, а что такого? У меня проц многоядерный и озу дофига :D

А по документации вроде получается, что всё не так.

  • Task не есть поток.
  • ThreadPool используется по умолчанию в Task, или при указании TaskScheduler.Default.
  • Синхронизировать делегат с UI можно через
    • Control.Invoke/BeginInvoke в WF
    • Dispatcher.Invoke/BeginInvoke в WPF
  • Task с не умолчальным, а с TaskScheduler.FromCurrentSynchronizationContext передаёт на выполнение делегаты в эти самые методы, в зависимости от того, WF или WPF используется в данном коде.
    Т.е. с FromCurrentSynchronizationContext можно использовать одну и ту же запись и в WF, и в WPF. Что удобно.
https://blogs.msdn.microsoft.c... oncontext/
http://reedcopsey.com/2010/03/... scheduler/

В 20 строке это сокращённая запись, вместо Task Continuation.

Поправьте, если я ошибаюсь.

0
Usaga
31.05.2017, 18:18
  #14

Не по теме:

Rius, я не знал об этой особенности тасков. Спасибо за информацию! :good:

0
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
31.05.2017, 20:14  [ТС] 15
Цитата Сообщение от Rius Посмотреть сообщение
1.Что, правда? Вы-таки полагаете, что я напрасн указал код и именно эти строки? Подумайте ещё раз.
2. Можно. Только кода, оборачивающего копирование в поток будет больше.
К тому же там нет не строчки чтобы передавала процесс копирование файла в progressbar
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,658
Записей в блоге: 14
31.05.2017, 20:52 16
Но ведь работает же!
Скачивание файла (копирование с ftp сервера) выполняется в отдельном потоке.
Если бы прогресс копирования не выводился в поток UI, то ProgressBar не двигался бы.
Можете скачать исходник, собрать, запустить и убедиться.

Добавлено через 16 минут
Если не осилите, тут попроще есть: Загрузка файла на сервер с использованием BackgroundWorker - отображение прогресса
А здесь и на BackgroundWorker от гуру: Совместная работа ProgressBar и BackgroundWorker
0
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
31.05.2017, 21:13  [ТС] 17
Ну так мне показ на progressBar нужна тоже не только не зависания. Темболе копировать файл из одного пути в другой
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,658
Записей в блоге: 14
31.05.2017, 21:29 18
Есть операция в потоке, чтобы ui не зависал. А есть вывод данных из потока в ui, т.н. синхронизация. Это отдельные части, которые можно реализовать различными методами.
0
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
01.06.2017, 15:14  [ТС] 19
Цитата Сообщение от Rius Посмотреть сообщение
Есть операция в потоке, чтобы ui не зависал. А есть вывод данных из потока в ui, т.н. синхронизация. Это отдельные части, которые можно реализовать различными методами.
Может ты пример дашь исходник с копированием файла из одного места в другое с показом на progressbar при этом интернет вообще не должен быть задействован так как не нужен.
Буду оч признателен
0
1453 / 845 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
01.06.2017, 16:05 20
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Может ты пример дашь исходник с копированием файла из одного места в другое с показом на progressbar при этом интернет вообще не должен быть задействован так как не нужен.
На форме только progressBar1

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
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            this.Load += Form1_Load;
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Task.Run(() =>
            {
 
                var from = new FileInfo(@"E:\...\SW_DVD5_Office_2016_64Bit_Russian_MLF_X20-42506.ISO");
                var to = new FileInfo(@"D:\...\SW_DVD5_Office_2016_64Bit_Russian_MLF_X20-42506.ISO");
 
                if (!to.Exists)
                    to.Create().Dispose();
 
                using (var fromStream = from.OpenRead())
                using (var toStream = to.OpenWrite())
                {
                    byte[] buffer = new byte[16384];
                    int count;
                    long readed = 0;
                    long total = from.Length;
 
                    while ((count = fromStream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        toStream.Write(buffer, 0, count);
 
                        readed += count;
 
                        int percent = Convert.ToInt32((readed * 100) / total);
                        
                        //Отображаем прогресс
                        this.BeginInvoke(new Action<int>(perc =>
                        {
                            this.progressBar1.Value = perc;
                        }), percent);
                        //////
                    }
                }
 
            });
        }
    }
1
01.06.2017, 16:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.06.2017, 16:05
Помогаю со студенческими работами здесь

Поиск файлов. При закрытии программы - зависания.
подскажите что не так. первый раз при входе в windows выполняю поиск - ищет довольно долго. второй...

Организация поиска с загрузкой результатов в ListBox без зависания программы
Здравствуйте! Использую такой код для поиска всех файлов меньше 5 мб на диске Х с последующее их...

Вывод итератора цикла в отдельной строке в textBox без зависания программы
Всем привет) Меня очень сильно сбивает с толку работа с потоками, поэтому хочу на простом примере...

Копирование файлов с FTP-сервера на компьютеры клиентов без замены уже имеющихся файлов
Приветствую. Такая задача. имеется фтп сервер. на нем лежит 5 папок, в каждой паке каждый день...

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

Копирование файлов без win api
Добрый день. Что прошу: Мне нужно выполнить копирование моего (ехе) в определенные директории -...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru