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

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

Похожие вопросы