2009-09-20 21 views
10

Come si legge un array di byte non elaborato da qualsiasi file e si scrive nuovamente l'array di byte in un nuovo file?C# - Come faccio a leggere e scrivere un file binario?

+5

Codifica e scrittura binaria? La codifica è una cosa "stringa". Non dovresti avere problemi quando hai a che fare con dati binari. –

+0

Jeremy, vuoi dire "a seconda del tipo di file il * formato * varia ..."? se il codice che stai utilizzando cerca di leggere/scrivere file con il tipo/formato di file sbagliato sono sicuro che ci sarebbe corruzione. – pavium

+3

Leggere un file come 'byte []' non è necessariamente una buona idea; questo potrebbe essere ** molto ** costoso per file di grandi dimensioni. –

risposta

7

(edit: notare che la domanda è cambiato, ma non ha menzionato byte[] inizialmente; vedi revision 1)

Beh, File.Copy salti in mente; ma per il resto questo suona come uno scenario 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

sai di TextReader e TextWriter, e loro discendenti StreamReader e StreamWriter? Penso che questi risolveranno il tuo problema perché gestiscono le codifiche, BinaryReader non conosce codifiche o persino testo, riguarda solo i byte.

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 ha chiesto di leggere e scrivere file BINARY, vero? – pavium

+3

Se si tratta solo di dati binari, allora perché c'è qualche problema con la codifica del char? –

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

Si noti che per file di grandi dimensioni che potrebbero essere * molto * costosi. –

0

Aggiunta di un aggiornato risposta,

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

è possibile specificare la dimensione del buffer

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

o si potrebbe eseguire l'operazione su un altro thread,

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

che sarebbe utile quando il thread principale ha a che fare altri lavori, come con WPF e le applicazioni di Windows Store.

Problemi correlati