2009-09-20 1 views
10

Как читать исходный массив байтов из любого файла и записывать этот массив байтов в новый файл?C# - Как читать и писать двоичный файл?

+5

Кодировка & BinaryWriter? Кодирование - это «строка». У вас не должно быть проблем, когда вы имеете дело с двоичными данными. –

+0

Джереми, вы имеете в виду «в зависимости от типа файла * формат * меняется ...»? если используемый вами код пытается читать/записывать файлы с неправильным типом/форматом файла, я уверен, что будет коррупция. – pavium

+3

Чтение файла как 'byte []' не обязательно является хорошей идеей; это может быть ** очень ** дорогостоящим для больших файлов. –

ответ

7

(редактирование: обратите внимание, что вопрос изменился, это не говоря уже о byte[] изначально, см revision 1)

Ну, File.Copy прыжков на ум; но в остальном это звучит как Stream сценария:

using (Stream source = File.OpenRead(inPath)) 
    using (Stream dest = File.Create(outPath)) { 
     byte[] buffer = new byte[2048]; // pick size 
     int bytesRead; 
     while((bytesRead = source.Read(buffer, 0, buffer.Length)) > 0) { 
      dest.Write(buffer, 0, bytesRead); 
     } 
    } 
3

вы знаете о TextReader и TextWriter ли, и их потомки StreamReader и StreamWriter? Я думаю, что это решит вашу проблему, потому что они обрабатывают кодировки, BinaryReader не знает о кодировках или даже тексте, он касается только байтов.

How to read text from a file

How to write text to a file

This is an excellent intro to file IO and encodings.

+0

Джереми спросил о чтении и записи файлов BINARY, не так ли? – pavium

+3

Если это всего лишь двоичные данные, тогда почему возникает проблема с кодировкой символов? –

5
byte[] data = File.ReadAllBytes(path1); 
File.WriteAllBytes(path2, data); 
+2

Обратите внимание, что для больших файлов, которые могут быть очень дорогими. –

0

Добавление до даты ответа,

using (var source = File.OpenRead(inPath)) 
{ 
    using (var dest = File.Create(outPath)) 
    { 
     source.CopyTo(dest); 
    } 
} 

вы можете дополнительно указать размер буфера

using (var source = File.OpenRead(inPath)) 
{ 
    using (var dest = File.Create(outPath)) 
    { 
     source.CopyTo(dest, 2048); // or something bigger. 
    } 
} 

или вы могли бы выполнить операцию в другом потоке,

using (var source = File.OpenRead(inPath)) 
{ 
    using (var dest = File.Create(outPath)) 
    { 
     await source.CopyToAsync(dest); 
    } 
} 

, которые были бы полезны, когда основной поток должен делать другую работу, как с WPF и приложений для Windows Store.