2015-03-03 3 views
0

У меня есть интересный сценарий, я надеюсь, что кто-то еще наткнулся. Я пытаюсь скопировать часть открытого FileStream для разделения файла streamin C# .Net 3.5. Используя приведенный ниже код, я прочитал 37 «кусков» из 4096 байт, но не смог прочитать последний «частичный кусок» из 3812 байтов.FileStream.Read not reading last 'chunk'

string filPath = "c:\aRatherSmallFileThatCouldBeQuiteLarge.log"; 
string tmpNam = Path.GetTempFileName(); 
using (FileStream wt = new FileStream(tmpNam, FileMode.Open, FileAccess.Write)) 
{ 
    using (FileStream rd = new FileStream(filPath, FileMode.Open, FileAccess.Read)) 
    { 
     long cutPosition = 65217; 
     int bytesRead; 
     int chunkSize = 4096; 
     byte[] buffer = new byte[chunkSize]; 
     while ((bytesRead = rd.Read(buffer, 0, chunkSize)) != 0) 
      wt.Write(buffer, 0, bytesRead); 
    } 
    File.Copy(tmpNam, filPath, true); 
} 
File.Delete(tmpNam); 

Ошибок не получено; окончательные 3812 байт просто не записываются в файл назначения, как ожидалось.

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

ответ

1

Я думаю, вам нужно переместить File.Copy за пределы using блоков:

using (FileStream wt = new FileStream(tmpNam, FileMode.Open, FileAccess.Write)) 
{ 
    using (FileStream rd = new FileStream(filPath, FileMode.Open, FileAccess.Read)) 
    { 
     ... 
    } // closes the read stream 
    // you're trying to move the file here, before the write stream is flushed out 
} // closes the write stream (flushing out the last chunk) 
// Do the copy after the write stream has been flushed and closed 
File.Copy(tmpNam, filPath, true); 
File.Delete(tmpNam); 

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

+0

Спасибо @Cory, но они как раз на месте, чтобы передать намерение кода. В настоящее время я просто открываю файл tmp и замечаю, что он неполный. – Vic

+0

Вы делаете что-то с 'cutPosition', которое мы не видим в приведенном выше примере? Вы не используете его здесь. –

+0

Нет, на самом деле ваш первый комментарий был совершенно прав. Я ломался на линии до того, как поток записи закрылся ... и, таким образом, до того, как он станет последним флешем. Большое спасибо. Ответ принят. – Vic