2010-10-12 17 views
11

Necesito escribir el contenido de un archivo en otro archivo utilizando los métodos File.OpenRead y File.OpenWrite. No puedo entender cómo hacerlo.¿Cómo escribir el contenido de un archivo en otro?

¿Cómo puedo modificar el siguiente código para que funcione para mí.

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

¿Qué pasa con el código que publicaste? ¿Qué error obtienes? –

+1

¿Estoy confundido acerca de si debería leer todos los bytes de una vez o no? ¿Cuáles son las implicaciones y además de stream.length es largo mientras que reader.ReadBytes espera int. – Sumee

+1

su pregunta es clave, ¿debería leer todos los bytes de una vez o no? La implicación es la cantidad de memoria que desea que utilice su proceso cuando se llama a este fragmento de código (en función del tamaño del archivo, por supuesto). Leerlo todo de una vez podría costar mucha memoria. Otras respuestas muestran cómo dividirlo en mordidas de 1K o 4K. Si lo parte, tenga en cuenta que podría resultar en una penalización de rendimiento. Esas son sus compensaciones. Analice su situación y elija cuál se ajusta mejor a sus necesidades. –

Respuesta

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); 
     } 
    } 

pregunto por qué no para usar esto:

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

¿Las instrucciones BinaryReader y BinaryWriter son necesarias? – Hong

+0

Claro que puede reemplazarlos por "var" –

+1

¿Podría decirme el uso de esas dos afirmaciones? En otras palabras, ¿qué pasaría sin estas dos declaraciones? – Hong

0

Uso FileStream clase, desde System.IO.

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

mi ejemplo de código usa filestream. ¿Cómo debo modificar este código para que funcione? – Sumee

+0

@Summe: no lo usa. – Svisstack

1

probar algo a lo largo de estas líneas:

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); 
    } 
} 

Tenga en cuenta que esto es algo 'esqueleto' y usted debe modificar según sea necesario para su aplicación de la misma.

+0

¿Por qué dices que debo cambiarlo según lo requiera mi aplicación? ¿Quiere decir que necesito decidir el tamaño del fragmento (que en su caso es 4mb)?¿De verdad deberíamos leer los bytes en fragmentos o podemos hacerlo de una vez? – Sumee

+0

El tamaño del byte es 4k no 4mb. –

+0

@Sumee Imagino que leer todo de una vez, depende de su tamaño de archivo, si tiene un archivo realmente masivo, quizás leer todo podría ser demasiado grande para su buffer. (No sé lo que sucede, y luego sospecho que es posible que no obtenga todo el texto como espera) – onaclov2000

1

¿Es necesario para nosotros FileStream? Porque puedes hacerlo fácilmente con File Class simple;

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

¿Ha comprobado que el lector está leyendo todos los datos? This MSDN page tiene un ejemplo que comprueba todos los datos se lee:

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

La otra alternativa es que es probable que necesite Flush el búfer de salida:

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

¿Esto se agregará o escribirá? – eaglei22

4

Debe utilizar File.Copy a menos que desee agregar al segundo archivo.

Si desea agregar, puede seguir utilizando la clase Archivo.

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

Simple y bueno para archivos pequeños. Obviamente, no le conviene usar esto para archivos grandes, ya que estaría cargando todo el contenido del archivo en la memoria. – contactmatt

0

Si usted no está interesado en el uso de lectura/escritura de la función de archivo, que mejor puede tratar de usar la funcionalidad de copia

Easiest will be : 

     File.Copy(source_file_name, destination_file_name, true) 

cierto -> para sobrescribir el archivo existente, sin la "verdadera" que lo hará cree un nuevo archivo. Pero si el archivo ya existe arrojará una excepción sin un argumento "verdadero".

Cuestiones relacionadas