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

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

Войти через TM ID
Похожие вопросы
Континент Москва
До 160 000 руб.
Faradise Москва
от 120 000 до 120 000 руб.
R-telematica Start Москва
от 160 000 руб.
13 дек. 2018, в 23:34
5000 руб./за проект
13 дек. 2018, в 22:52
5000 руб./за проект