Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Функция для копирования файлов


Автор: kiler4747 1.7.2011, 17:38
Написал программу для копирования файлов. Само копирование происходит в отдельном потоке. Мне нужно чтобы при копировании отображался сам процесс на progressBar-е и в label поэтому класс File не подходит. При тесте функции копирования использовал флэшку с NTFS, скорость была нормальная(10мб/с), но при использовании флэшки с FAT скорость копирования падает до 1мб/с и ниже. Форматировал первую флэшку в FAT - точно такой же результат. Почему так происходит и как это исправить? Если функцию написать на C++ скорость копирования будет зависеть от типа файловой системы?
Код

void FileCopy(string sours, string dest)
            {
                byte[] buffer = new byte[4096];
                FileStream Temp = new FileStream(dest, FileMode.Create);
                FileStream TempSours = new FileStream(sours, FileMode.Open, FileAccess.Read);
                int byt = 0;
                while ((byt = TempSours.Read(buffer, 0, 4096)) == 4096)
                {
                    Temp.Write(buffer, 0, byt);
                    progressBar1.Invoke(new MethodInvoker(delegate { progressBar1.Value += byt / 4096; }));
                    label1.Invoke(new MethodInvoker(delegate
                    {
                        label1.Text = "Скопированно " +
                            Form1.SizeFiles(progressBar1.Value * 4096) + " из" + allSize;
                    }));
                }
                Temp.Write(buffer, 0, byt);
                progressBar1.Invoke(new MethodInvoker(delegate { progressBar1.Value += byt / 4096; }));
                Application.DoEvents();
                Temp.Close();
                TempSours.Close();
            }

Автор: jonie 1.7.2011, 17:41
один фиг не надо каждый раз (каждую итерацию) делать уведомления гуя о процетах. Получите размер файла - поделите на 100 - получите чему равен 1% (если уж вы хотите по 1% показывать, хотя и это глупо) - и вызывайте тогда когда надо.

Автор: kiler4747 1.7.2011, 18:02
Я пробывал полностью выключать отображение процесса, т.е.

while ((byt = TempSours.Read(buffer, 0, 4096)) == 4096)
    {
         Temp.Write(buffer, 0, byt);
    }

Но всеравно скорость записи очень низкая.

Автор: kiler4747 2.7.2011, 14:32
Решил проблему увеличение буфера с 4096 до 4096 * 100.
Можно делать и через класс File и нужно пустить второй поток для отображения информации:
Код

class TestFileSize
        {
            Thread thr;
            string Path;
            public void Startt(string str)
            {
                thr = new Thread(StartThreadEX);
                Path = str;
                thr.IsBackground = true;
                thr.Start();
            }
            void StartThreadEX()
            {
                while (true)
                {
                    try
                    {
                        FileInfo file = new FileInfo(Path);
                        double sizee = file.Length;
                    }
                    catch (Exception ex)
                    { }
                    finally
                    {
                        Thread.Sleep(10000);
                    }
                }
            }
        }

 smile 

Автор: cream 3.7.2011, 16:05
Цитата(kiler4747 @  2.7.2011,  14:32 Найти цитируемый пост)
Решил проблему увеличение буфера с 4096 до 4096 * 100.

kiler4747, а теперь какая скорость копирования на флешку с FAT?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)