readallbytes net leer descargar convertir bytes binario arreglo archivo c#

c# - net - Forma confiable de convertir un archivo a un byte



file readallbytes c# (6)

Encontré el siguiente código en la web:

private byte [] StreamFile(string filename) { FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read); // Create a byte array of file stream length byte[] ImageData = new byte[fs.Length]; //Read block of bytes from stream into the byte array fs.Read(ImageData,0,System.Convert.ToInt32(fs.Length)); //Close the File Stream fs.Close(); return ImageData; //return the byte data }

¿Es lo suficientemente confiable para convertir un archivo en byte [] en c #, o hay una forma mejor de hacerlo?


No repita lo que todos ya han dicho, pero tenga a mano la siguiente hoja de trucos para las manipulaciones de archivos:

  1. System.IO.File.ReadAllBytes(filename);
  2. File.Exists(filename)
  3. Path.Combine(folderName, resOfThePath);
  4. Path.GetFullPath(path); // converts a relative path to absolute one
  5. Path.GetExtension(path);

Otros han notado que puede usar el File.ReadAllBytes . El método incorporado está bien, pero vale la pena señalar que el código que publica más arriba es frágil por dos motivos:

  1. Stream es IDisposable : debe colocar la inicialización FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read) en una cláusula using para asegurarse de que el archivo esté cerrado. De lo contrario, la secuencia permanecerá abierta si se produce una falla, lo que significa que el archivo permanece bloqueado, lo que puede ocasionar otros problemas más adelante.
  2. fs.Read puede leer menos bytes de los que solicita. En general, el método .Read de una instancia de Stream leerá al menos un byte, pero no necesariamente todos los bytes que solicite. Tendrá que escribir un bucle que vuelva a intentar leer hasta que se lean todos los bytes. Esta página explica esto con más detalle.

Todas estas respuestas con .ReadAllBytes() . Otro, similar (no voy a decir duplicar, ya que estaban tratando de refactorizar su código), se preguntaba en SO aquí: ¿La mejor manera de leer un archivo grande en una matriz de bytes en C #?

Se realizó un comentario sobre una de las publicaciones relacionadas con .ReadAllBytes() :

File.ReadAllBytes throws OutOfMemoryException with big files (tested with 630 MB file and it failed) – juanjo.arana Mar 13 ''13 at 1:31

Un mejor enfoque, para mí, sería algo como esto, con BinaryReader :

public static byte[] FileToByteArray(string fileName) { byte[] fileData = null; using (FileStream fs = File.OpenRead(fileName)) { var binaryReader = new BinaryReader(fs); fileData = binaryReader.ReadBytes((int)fs.Length); } return fileData; }

Pero así soy yo ...

Por supuesto, todo esto supone que tienes la memoria para manejar el byte[] una vez que se lee, y no puse el File.Exists verificación para asegurar que el archivo esté allí antes de continuar, como lo harías antes llamando a este código


se ve lo suficientemente bien como una versión genérica. Puede modificarlo para satisfacer sus necesidades, si son lo suficientemente específicas.

también prueba excepciones y condiciones de error, como que el archivo no existe o no se puede leer, etc.

también puede hacer lo siguiente para ahorrar espacio:

byte[] bytes = System.IO.File.ReadAllBytes(filename);


byte[] bytes = File.ReadAllBytes(filename)

o ...

var bytes = File.ReadAllBytes(filename)


byte[] bytes = System.IO.File.ReadAllBytes(filename);

Eso debería hacer el truco. ReadAllBytes abre el archivo, lee su contenido en una nueva matriz de bytes y luego lo cierra. Aquí está la página de MSDN para ese método.