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 como para convertir un archivo al byte [] en c #, o hay una mejor manera de hacerlo?
fs.Close()
la parte final de una instrucción try-finalmente que incluya el resto del código, para asegurarse deClose
que realmente se llame.Respuestas:
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.
fuente
FileShare.ReadWrite
afterFile.Read
byte[] bytes = File.ReadAllBytes(filename)
o ...
var bytes = File.ReadAllBytes(filename)
fuente
var
. Es mi opinión personal (y la de muchos otros), que debería usarse tanto como sea posible. :) El asunto ha sido discutido varias veces en este sitio antes, de hecho.var
. Tiendo a pensar que cualquier programador que necesite deletrear tipos de forma manual y explícita está trabajando con un nivel de abstracción demasiado bajo. No debe importa lo que el tipo exacto de la variable es, sólo lo que la variable es para . Si almacena los bytes del archivo, entonces eso debería ser lo que importa. No si es una lista o una matriz o MyCustomContainer.var
hubiera sido relevante para la respuesta real, discutir sobre su uso habría tenido sentido. Pero aquí, la parte importante de la respuesta es justaFile.ReadAllBytes(filename)
. Cómo y si el resultado se almacena en una variable es tan irrelevante como el nombre de la variable o el espacio después del=
.No es para repetir lo que todos ya han dicho, pero tenga a mano la siguiente hoja de trucos para manipulaciones de archivos:
System.IO.File.ReadAllBytes(filename);
File.Exists(filename)
Path.Combine(folderName, resOfThePath);
Path.GetFullPath(path); // converts a relative path to absolute one
Path.GetExtension(path);
fuente
Todas estas respuestas con
.ReadAllBytes()
. Otra pregunta similar (no diré duplicada, ya que estaban tratando de refactorizar su código) se hizo en SO aquí: ¿La mejor manera de leer un archivo grande en una matriz de bytes en C #?Se hizo un comentario en una de las publicaciones con respecto a
.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 ese soy solo yo ...
Por supuesto, todo esto supone que tiene la memoria para manejarlo
byte[]
una vez que se lee, y no puse laFile.Exists
verificación para asegurarme de que el archivo esté allí antes de continuar, ya que lo haría antes de llamar a este código.fuente
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 pruebe las 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);
fuente
Otros han notado que puede usar el archivo
File.ReadAllBytes
. El método incorporado está bien, pero vale la pena señalar que el código que publica arriba es frágil por dos razones:Stream
esIDisposable
: debe colocar laFileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read)
inicialización en una cláusula using para asegurarse de que el archivo esté cerrado. No hacer esto puede significar que la transmisión permanece abierta si ocurre una falla, lo que significará que el archivo permanecerá bloqueado, y eso puede causar otros problemas más adelante.fs.Read
puede leer menos bytes de los que solicita. En general, el.Read
método de unaStream
instancia leerá al menos un byte, pero no necesariamente todos los bytes que solicite. Deberá escribir un bucle que vuelva a intentar leer hasta que se lean todos los bytes. Esta página explica esto con más detalle.fuente