sputnickk
@sputnickk

Как организовать процесс при копировании?

Всем привет!

Копирую с сетевого ресурса архив. Как отразить процесс?

Сначала юзал вот такой метод:

...
   int i = 0;
            FileStream fin = new FileStream(source, FileMode.Open);
            FileStream fout = new FileStream(destatntion, FileMode.Create);
            progressBarCopy1.Maximum = Convert.ToInt32(fin.Length);
            do
            {
                i = fin.ReadByte();
                if (i != -1)
                    fout.WriteByte((byte)i);

                //progressBarCopy1.Value = progressBarCopy1.Maximum - 1;
                progressBarCopy1.PerformStep();

            } while (i != -1);

            fin.Close();
            fout.Close();

            return i;
....


progressBarCopy1 отображается, все ок, но с сетевой папки копируется почему то очень медленно, с провисаниями и иногда даже файлы битые приходят.

Копирую вот таким способом:
int array_length = (int)Math.Pow(2, 19);
            byte[] dataArray = new byte[array_length];


            using (FileStream fsread = new FileStream
            (source, FileMode.Open, FileAccess.Read, FileShare.None, array_length))
            {
                progressBarCopy1.Maximum = Convert.ToInt32(fsread.Length);

                using (BinaryReader bwread = new BinaryReader(fsread))
                {
                    using (FileStream fswrite = new FileStream
                    (destination, FileMode.Create, FileAccess.Write, FileShare.None, array_length))
                    {
                        using (BinaryWriter bwwrite = new BinaryWriter(fswrite))
                        {
                            for (; ; )
                            {
                                progressBarCopy1.PerformStep();

                                int read = bwread.Read(dataArray, 0, array_length);
                                if (0 == read)
                                    break;
                                bwwrite.Write(dataArray, 0, read);
                            }
                        }
                    }
                }
            }


все очень быстро копируется, но прогресс бар не идет

winforms Framework 3.5 , посему асинхронные методы не доступны
  • Вопрос задан
  • 105 просмотров
Пригласить эксперта
Ответы на вопрос 1
lam0x86
@lam0x86
Во-первых, производить длительные операции (больше 100 миллисекунд) в UI-потоке - плохой тон. Приложение будет подвисать, пока файл не скопируется. Чтобы этого избежать, все дисковые операции должны быть асинхронны (вместо async/await можно использовать FileStream.BeginRead/EndRead).
Во-вторых, у вас слишком большой буфер. 2^19 - это 512 килобайт. Возможно, вы копируете файлы меньшего размера, поэтому всё копирование происходит в одну операцию чтения. Попробуйте буфер, скажем, в 16кб.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Агент Плюс Астрахань
от 35 000 руб.
Агент Плюс Астрахань
от 50 000 руб.
Аскон Санкт-Петербург
от 130 000 до 180 000 руб.
24 мая 2019, в 23:37
100000 руб./за проект
24 мая 2019, в 21:53
500 руб./в час
24 мая 2019, в 21:36
500 руб./за проект