2010-10-12 9 views
11

Ho bisogno di scrivere il contenuto di un file in un altro file usando i metodi File.OpenRead e File.OpenWrite. Non riesco a capire come farlo.Come scrivere il contenuto di un file in un altro file?

Come posso modificare il seguente codice per funzionare per me.

using (FileStream stream = File.OpenRead("C:\\file1.txt")) 
using (FileStream writeStream = File.OpenWrite("D:\\file2.txt")) 
{ 
     BinaryReader reader = new BinaryReader(stream); 
     BinaryWriter writer = new BinaryWriter(writeStream); 
     writer.Write(reader.ReadBytes(stream.Length)); 
} 
+0

Cosa c'è di sbagliato nel codice che hai postato? Che errore ottieni? –

+1

Sono confuso su dove dovrei leggere tutti i byte in una volta o no? quali sono le implicazioni e inoltre stream.length è lungo mentre reader.ReadBytes si aspetta int. – Sumee

+1

la tua domanda è la chiave - dovresti leggere tutti i byte in una volta o no? L'implicazione è la quantità di memoria che si desidera venga utilizzata dal processo quando viene chiamato questo blocco (in base alla dimensione del file, ovviamente). Leggere tutto in una volta potrebbe costare molta memoria. Altre risposte mostrano come ridurlo in morsi 1K o 4K. Se lo metti a parte, nota che ciò potrebbe comportare una penalizzazione delle prestazioni. Questi sono i tuoi trade-off. Analizza la tua situazione e scegli quale si adatta meglio alle tue esigenze. –

risposta

20
using (FileStream stream = File.OpenRead("C:\\file1.txt")) 
    using (FileStream writeStream = File.OpenWrite("D:\\file2.txt")) 
    { 
     BinaryReader reader = new BinaryReader(stream); 
     BinaryWriter writer = new BinaryWriter(writeStream); 

     // create a buffer to hold the bytes 
     byte[] buffer = new Byte[1024]; 
     int bytesRead; 

     // while the read method returns bytes 
     // keep writing them to the output stream 
     while ((bytesRead = 
       stream.Read(buffer, 0, 1024)) > 0) 
     { 
      writeStream.Write(buffer, 0, bytesRead); 
     } 
    } 

chiedo perché non per utilizzare questo:

File.Copy("C:\\file1.txt", "D:\\file2.txt"); 
+1

Le istruzioni BinaryReader e BinaryWriter sono necesarry? – Hong

+0

Sicuro di poterli sostituire con "var" –

+1

Potresti dirmi l'uso di queste due affermazioni? In altre parole, cosa succederebbe senza queste due affermazioni? – Hong

0

Usa FileStream di classe, da System.IO.

[ComVisibleAttribute(true)] 
public class FileStream : Stream 
+1

il mio esempio di codice utilizza filestream. Come dovrei modificare questo codice per funzionare? – Sumee

+0

@ Somma: non lo si utilizza. – Svisstack

1

provare qualcosa in queste righe:

using (FileStream input = File.OpenRead(pathToInputFile), 
    output = File.OpenWrite(pathToOutputFile)) 
{ 
    int read = -1; 
    byte[] buffer = new byte[4096]; 
    while (read != 0) 
    { 
     read = input.Read(buffer, 0, buffer.Length); 
     output.Write(buffer, 0, read); 
    } 
} 

Si noti che questo è un po 'scheletro' e si dovrebbe modificare come richiesto per l'applicazione di esso.

+0

Perchè dici, dovrei cambiarlo come richiesto dalla mia applicazione? Intendi dire che devo decidere la dimensione del chunk (che nel tuo caso è 4mb)?Dovremmo davvero leggere i byte a pezzi o possiamo farlo in un colpo solo? – Sumee

+0

La dimensione del byte è 4k non 4mb. –

+0

@Sumee Immagino che leggere tutto in una volta, dipenda dalla tua dimensione, se hai un file veramente voluminoso, forse la lettura di tutto potrebbe essere troppo grande per il tuo buffer? (Non so cosa succede, a parte poi ho il sospetto che tu non possa ottenere tutto il testo come ti aspetti) – onaclov2000

1

È necessario per noi FileStream? Perché puoi farlo facilmente con una semplice classe di file come;

using System.IO; 
string FileContent = File.ReadAllText(FilePathWhoseTextYouWantToCopy); 
File.WriteAllText(FilePathToWhomYouWantToPasteTheText,FileContent); 
0

Avete controllato che il lettore stia leggendo tutti i dati? This MSDN page ha un esempio che controlla tutti i dati vengono letti:

byte[] verifyArray = binReader.ReadBytes(arrayLength); 
    if(verifyArray.Length != arrayLength) 
    { 
     Console.WriteLine("Error reading the data."); 
     return; 
    } 

L'altra alternativa è che, probabilmente, è necessario Flush buffer di uscita:

writer.Flush(); 
1
using (var inputStream = File.OpenRead(@"C:\file1.txt")) 
{ 
    using (var outputStream = File.OpenWrite(@"D:\file2.txt")) 
    { 
     int bufferLength = 128; 
     byte[] buffer = new byte[bufferLength]; 
     int bytesRead = 0; 

     do 
     { 
      bytesRead = inputStream.Read(buffer, 0, bufferLength); 
      outputStream.Write(buffer, 0, bytesRead); 
     } 
     while (bytesRead != 0); 
    } 
} 
+0

verrà aggiunto o cancellato? – eaglei22

4

Si dovrebbe usare File.Copy a meno che non si voglia accodare al secondo file.

Se si desidera aggiungere, è ancora possibile utilizzare la classe File.

string content = File.ReadAllText("C:\\file1.txt"); 
File.AppendAllText("D:\\file2.txt",content); 
+0

Semplice e buono per i file di piccole dimensioni. Ovviamente non si vorrebbe usare questo per file di grandi dimensioni, come si caricherà l'intero contenuto del file in memoria. – contactmatt

0

Se non siete appassionati ad utilizzare Read/Write funzione del file, si può meglio provare a utilizzare la funzionalità di copia

Easiest will be : 

     File.Copy(source_file_name, destination_file_name, true) 

vero -> per sovrascrivere file esistente, senza "vera" lo farà crea un nuovo file. Ma se il file esiste già genererà un'eccezione senza argomento "vero".

Problemi correlati