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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как скопировать занятый фаил 
:(
    Опции темы
ddll
Дата 21.6.2011, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Копирую один фаил (офисовский документ) с одной директори в другую.

В этот момент файл открыт  другой програмой и выскакивает ошибка невозможно скопровать фаил занят другим процесом.
я использую просто 

 File.Copy(s1, s2, true);

Я понимаю что можно отлавливать exeptions но это для меня плохо тк с файлом человек может работать с файлом целый день.
Задача скопировать этот занятый фаил пусть даже непоследнюю версию.
Всем заранее спасибо за помошь и ответы!

Это сообщение отредактировал(а) ddll - 22.6.2011, 10:32
PM MAIL   Вверх
YurIOs
Дата 29.6.2011, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Можно побайтно скопировать файл с помощью подклассов Stream.  Для создания считывающего потока нужно использовать перегруженный метод File.Open() который позволяет открыть файл занятый другим процессом, для этого нужно использовать значение ReadWrite перечисления FileShare

Код

FileStream reader = File.Open(@"D:\home\temp\doc1.docx", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

FileStream writer = File.Create(@"D:\home\temp\doc2.docx");

while (reader.Position < reader.Length)
{
           writer.WriteByte((byte)reader.ReadByte());
}

reader.Close();
writer.Close();


Но при этом нет гарантии что тот другой процесс не начал запись в файл, или уже ее полностью завершил, поэтому копия может быть поврежденной.

Для файлов малых размеров метод подойдет, так как скорость копирования где-то 1 Мб/секунду. Есть идея как ускорить, завтра попробую реализовать.

Это сообщение отредактировал(а) YurIOs - 29.6.2011, 00:40
PM ICQ   Вверх
YurIOs
Дата 29.6.2011, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А вот и обещанный мной метод по шустрее.Ускорение достигаться за счет буфера.
При размере буфера в 1024 байт, скорость копирования файла больше 4 Гб на моем РС составляет 39 Мб/секунду.

Код

private static void CopyFile(string sourceFilePath, string destinationFilePath)
{
    FileStream reader = null;
    FileStream writer = null;

    try
    {
        reader = File.Open(sourceFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
        writer = File.Create(destinationFilePath);

        int bufferSize = 1024;
        int hasReaded = 0;

        byte[] buffer = new byte[bufferSize];

        while (reader.Position < reader.Length)
        {
            hasReaded = reader.Read(buffer, 0, bufferSize);
            writer.Write(buffer, 0, hasReaded);
        }
    }
    catch (IOException e)
    {
        Console.WriteLine(e.Message);
    }
    finally
    {
        reader.Close();
        writer.Close();
    }
}


Здесь также используется перегруженный метод File.Open() с использованием перечисления FileShare.ReadWrite
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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