2011-07-28 11 views
29

Me gustaría agregar una matriz de bytes a un archivo ya existente (C:\test.exe). Supongamos que la siguiente matriz de bytes:C# Añadir matriz de bytes al archivo existente

byte[] appendMe = new byte[ 1000 ] ; 

File.AppendAllBytes(@"C:\test.exe", appendMe); // Something like this - Yes, I know this method does not really exist. 

Me gustaría hacer esto utilizando File.WriteAllBytes, pero voy a estar usando una matriz de bytes enormes, y System.MemoryOverload excepción constantemente se está lanzando. Por lo tanto, lo más probable es que tenga que dividir la gran matriz en pedazos y anexar cada matriz de bytes al final del archivo.

Gracias,

Evan

+0

No entiendo el problema. –

+0

Mi objetivo principal es agregar dos matrices de bytes enormes juntas. Esto no es posible, sin embargo, como una excepción (sin memoria) se lanza. Por lo tanto, mi solución es escribir cada matriz de bytes en un archivo de salida por separado (en lugar de combinarlos y escribirlos en el archivo como uno solo). –

+0

Debería al menos proporcionar algún código que haya intentado ... Hasta ahora no está claro qué es lo que está causando su problema: todas las clases de Stream y Writer pueden escribir matrices de bytes directamente. –

Respuesta

47

Una forma sería la creación de un FileStream con el modo FileMode.Append creación.

Abre el archivo si existe y busca el final del archivo, o crea un nuevo archivo.

Esto sería algo como:

public static void AppendAllBytes(string path, byte[] bytes) 
{ 
    //argument-checking here. 

    using (var stream = new FileStream(path, FileMode.Append)) 
    { 
     stream.Write(bytes, 0, bytes.Length); 
    } 
} 
+0

Esto funcionó perfectamente - gracias –

+1

Esto se ve perfecto. Algunas otras respuestas usan BinaryWriter; ¿Por qué elegir uno sobre el método FileStream? Supongo que realiza exactamente la misma función, pero toma más líneas de código. – radsdau

+1

¿Necesita enjuagar? –

3

No estoy exactamente seguro de lo que la pregunta es, pero C# tiene un método BinaryWriter que toma una matriz de bytes.

BinaryWriter(Byte[])

bool writeFinished = false; 
string fileName = "C:\\test.exe"; 
FileStream fs = new FileString(fileName); 
BinaryWriter bw = new BinaryWriter(fs); 
int pos = fs.Length; 
while(!writeFinished) 
{ 
    byte[] data = GetData(); 
    bw.Write(data, pos, data.Length); 
    pos += data.Length; 
} 

Dónde writeFinished es cierto cuando todos los datos se ha anexado, y GetData() devuelve una matriz de datos que se adjunta.

6
  1. Crear un nuevo FileStream.
  2. Seek() hasta el final.
  3. Write() bytes.
  4. Close() la corriente.
+0

Esta parece ser la mejor solución para mi problema. Lo intentaré y te lo haré saber. Gracias –

5

También puede utilizar el incorporado en FileSystem.WriteAllBytes Method (String, Byte[], Boolean).

public static void WriteAllBytes(
    string file, 
    byte[] data, 
    bool append 
) 

Conjunto anexe a verdadera para anexar el contenido del archivo; False para sobrescribir el contenido del archivo. El valor predeterminado es falso.

+1

Por lo que puedo decir, esta es una solución única de VB.Net. https://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.filesystem.writeallbytes(v=vs.110).aspx –

0

simplemente puede crear una función para hacer esto

public static void AppendToFile(string fileToWrite, byte[] DT) 
{ 
    using (FileStream FS = new FileStream(fileToWrite, File.Exists(fileToWrite) ? FileMode.Append : FileMode.OpenOrCreate, FileAccess.Write)) { 
     FS.Write(DT, 0, DT.Length); 
     FS.Close(); 
    } 
} 
+1

usando {} no necesita llamar 'FS.Close();' – GSP

Cuestiones relacionadas