2009-09-20 15 views
10

Jak odczytać surową tablicę bajtów z dowolnego pliku i zapisać tablicę bajtów z powrotem do nowego pliku?C# - Jak mogę odczytać i zapisać plik binarny?

+5

Kodowanie i BinaryWriter? Kodowanie to "string". Nie powinieneś mieć problemu, kiedy masz do czynienia z danymi binarnymi. –

+0

Jeremy, masz na myśli "w zależności od typu pliku * format * zmienia się ..."? jeśli kod, którego używasz, próbuje odczytać/zapisać pliki o niewłaściwym typie/formacie pliku, jestem pewien, że będzie korupcja. – pavium

+3

Czytanie pliku jako 'byte []' niekoniecznie jest dobrym pomysłem; może to być ** bardzo ** drogie dla dużych plików. –

Odpowiedz

7

(edit: zauważ, że kwestia zmieniła; nie wspominając byte[] początkowo patrz revision 1)

No File.Copy skoków do głowy; ale inaczej to brzmi jak Stream scenariusz:

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

wiesz o TextReader i TextWriter, a ich potomkowie StreamReader i StreamWriter? Myślę, że rozwiążą to twój problem, ponieważ obsługują kodowanie, BinaryReader nie wie o kodowaniu, a nawet tekście, dotyczy tylko bajtów.

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

Jeremy zapytał o czytanie i pisanie plików BINARY, prawda? – pavium

+3

Jeśli jest to tylko dane binarne, to dlaczego jest jakiś problem z kodowaniem znaków? –

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

Należy pamiętać, że w przypadku dużych plików, które mogą być * bardzo * drogie. –

0

dodanie aktualne odpowiedzi

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

można opcjonalnie określić wielkość bufora

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

czy można wykonać operację w innym wątku,

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

która byłaby przydatna, gdy główny wątek ma wykonywać inne czynności, jak z WPF i Windows Store aplikacji.

Powiązane problemy