@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кб.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
ООО "Ноп Солюшенс" Ярославль
До 100 000 руб.
LC Group Новосибирск
от 90 000 до 160 000 руб.
Rubius Томск
от 60 000 до 80 000 руб.
23 февр. 2019, в 03:05
40000 руб./за проект
22 февр. 2019, в 23:23
30000 руб./за проект
22 февр. 2019, в 22:04
1250 руб./за проект