2009-09-20 15 views
10

¿Cómo leo un conjunto de bytes sin formato de cualquier archivo y lo vuelvo a escribir en un nuevo archivo?C# - ¿Cómo leo y escribo un archivo binario?

+5

Encoding & Binarywriter? La codificación es una cosa "cuerda". No debería tener un problema cuando se trata de datos binarios. –

+0

Jeremy, ¿quiere decir "dependiendo del tipo de archivo el * formato * varía ..."? si el código que está utilizando intenta leer/escribir archivos con el tipo/formato de archivo incorrecto, estoy seguro de que habría corrupción. – pavium

+3

Leer un archivo como 'byte []' no es necesariamente una buena idea; esto podría ser ** muy ** costoso para archivos grandes. –

Respuesta

7

(edit: tenga en cuenta que la cuestión ha cambiado, sino que no mencionó inicialmente byte[]; ver revision 1)

Bueno, File.Copy saltos a la mente; pero por lo demás esto suena como un escenario 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

sabe usted de TextReader y TextWriter, y sus descendientes StreamReader y StreamWriter? Creo que esto resolverá tu problema porque manejan codificaciones, BinaryReader no sabe sobre codificaciones o incluso texto, solo se ocupa de los bytes.

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 preguntó acerca de leer y escribir archivos BINARY, ¿no? – pavium

+3

Si solo se trata de datos binarios, ¿por qué hay algún problema con la codificación de caracteres? –

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

Tenga en cuenta que para archivos grandes que pueden ser * muy * costosos. –

0

Adición de una respuesta hasta la fecha,

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

opcionalmente puede especificar el tamaño del búfer

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

o se puede realizar la operación en otro hilo,

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

que sería útil cuando el hilo principal tiene que hacer otro trabajo, al igual que con WPF y aplicaciones de Windows Store.

Cuestiones relacionadas