2011-05-11 13 views
8

Actualmente, estoy leyendo datos de un archivo binario (File.ReadAllBytes), convirtiendo esta matriz de bytes en una cadena y agregando datos a esta cadena. Por último, estoy convirtiendo la cadena de nuevo en una matriz de bytes y escribiendo los datos en un nuevo archivo.Adjuntar datos a la matriz de bytes

Sí - este método es bastante idiota, y yo he tenido curiosidad acerca de si hay o no alguna forma de añadir esta nuevos datos sobre el extremo de la matriz de bytes (en la forma de un byte).

String s = @"C:\File.exe"; 
Byte b[] = File.ReadAllBytes(s); 

String NewString = ConvertToString(b[]); 

NewString = NewString + "Some Data"; 

b[] = ConvertToByteArray(NewString); 
File.WriteAllBytes(b[]); 

// ConvertToByteArray y ConvertToString representan funciones que convierte cadena> Byte> cadena.

Lo que me gustaría hacer:

b[] = file.readallbytes(s) 
b = b + "new Data" 
file.writeallbytes(b[]) 

muchas gracias por cualquier idea sobre el asunto.

Respuesta

16

Debería acostumbrarse a trabajar con Streams; en este caso, podría usar un MemoryStream para lograr exactamente lo mismo sin todas esas matrices desagradables.

byte[] bytes = File.ReadAllBytes(inFilePath); 
using (MemoryStream ms = new MemoryStream()) 
{ 
    // You could also just use StreamWriter to do "writer.Write(bytes)" 
    ms.Write(bytes, 0, bytes.Length); 

    using (StreamWriter writer = new StreamWriter(ms)) 
    { 
     writer.Write("Some Data"); 
    } 

    File.WriteAllBytes(outFilePath, ms.ToArray()); 
} 

Aparentemente esto parece toda una carga más complicado que su código, pero bajo las sábanas lo que está haciendo es más eficiente.

Por supuesto, si solo está escribiendo en otro archivo (o incluso en el mismo) simplemente puede escribir directamente en el archivo y omitir por completo una matriz byte o MemoryStream: esta es la belleza de las transmisiones.

+1

Esto funcionó exactamente como lo había imaginado. Muchas gracias por tu tiempo. (Todos ustedes). –

5

Uso FileStream, busque hasta el final del archivo, a continuación, escribir lo que necesita:

using (var fs = new FileStream(s, FileMode.Open, FileAccess.ReadWrite)) 
{ 
    fs.Seek(SeekOrigin.End); 
    fs.Write(data, 0, data.Length); 
} 

Si realmente necesita leer todo el archivo, a continuación, sólo tiene que utilizar Array.Resize para hacer su buffer mayor, y copiar sobre la parte que quieres agregar

var data = File.ReadAllBytes(s); 
Array.Resize(ref data, data.Length + toAppend.Length); 
Array.Copy(toAppend, 0, data, data.Length - toAppend.Length, toAppend.Length); 
File.WriteAllBytes(s, data); 

No hay "taquigrafía" para esto, lo siento. : \


Si el punto de esto todo es anexar una cadena, sólo tiene que utilizar File.AppendAllText!

+0

¿Está sugiriendo que use filestream para leer el archivo binario también? –

+0

@Evan: No, lo siento, mira mi edición. Eso suponía que en realidad no necesitabas leer todo el archivo; si lo haces, usa 'Array.Resize'. – Mehrdad

0

Crea una nueva matriz con el tamaño de la suma de dos matrices separadas, y luego copia tus matrices en ella.

+0

Creo que por "suma" quieres decir "concatenación" o algo así, ¿verdad? – Mehrdad

+0

No, creo que quiere decir "total" –

+0

@Mehrdad a1.Lenght + a2.Lenght es decir. Mi inglés no es bueno, triste, pero cierto :) –

2

Si lo que desea es añadir algo para el archivo, entonces usted debe estar usando un FileStream y una StreamWriter:

 using (var f = File.Open(@"C:\File.exe", FileMode.Append)) 
     using (var w = new StreamWriter(f)) 
      w.Write("new Data"); 

o algo similar a esto.

Si lo que desea es añadir un poco de bytes:

 using (var f = File.Open(@"C:\File.exe", FileMode.Append)) 
     { 
      byte[] buf = new byte[] { 69, 65, 66, 67 }; 
      f.Write(buf, 0, buf.Length); 
     } 
3

Utilice un List<Byte>, añadir todos los bytes desde la inicial ReadAllBytes usando AddRange, a continuación, agregue el siguiente conjunto de bytes. Finalmente, use CopyTo para copiar todos los bytes a una matriz (del tamaño List.Length).

+0

Tenía curiosidad, ¿cree que podría darme un ejemplo rápido de cómo unirme a lo siguiente? byte [] bData; string sData = "datos de prueba"; bData = bData + Convert.ToByte (sData); He leído un poco en la lista pero todavía estoy algo confundido. –

Cuestiones relacionadas