Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция для копирования файлов 
V
    Опции темы
kiler4747
  Дата 1.7.2011, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.2.2011

Репутация: нет
Всего: нет



Написал программу для копирования файлов. Само копирование происходит в отдельном потоке. Мне нужно чтобы при копировании отображался сам процесс на 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();
            }

PM MAIL Skype   Вверх
jonie
Дата 1.7.2011, 17:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
kiler4747
Дата 1.7.2011, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.2.2011

Репутация: нет
Всего: нет



Я пробывал полностью выключать отображение процесса, т.е.

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

Но всеравно скорость записи очень низкая.
PM MAIL Skype   Вверх
kiler4747
  Дата 2.7.2011, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.2.2011

Репутация: нет
Всего: нет



Решил проблему увеличение буфера с 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 
PM MAIL Skype   Вверх
cream
Дата 3.7.2011, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 23.7.2010

Репутация: 1
Всего: 1



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

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

Это сообщение отредактировал(а) cream - 3.7.2011, 16:05
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0820 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.