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 utilizar para convertir un archivo a byte[] en c#, o hay una manera mejor de hacer esto?

  • Usted debe poner fs.Close() en el que por fin parte de un try-finally declaración que encierra el resto del código, para garantizar Close se llama en realidad.
InformationsquelleAutor JL. | 2009-09-30

6 Comentarios

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

    Que debe hacer el truco. ReadAllBytes abre el archivo, lee su contenido en una nueva matriz de bytes, luego lo cierra. Aquí está el Página de MSDN para ese método.

    • Sería esto causa un bloqueo de archivo?
    • Quiero decir – una vez que el byte[] se rellena, no el archivo todavía ser bloqueado?
    • No, no – se cierra el archivo tan pronto como el byte de la matriz se rellena.
    • Sólo menor el problema con esto es que si usted tiene un archivo grande (digamos, 500 MB o 1 gb, etc.) va a asignar esa cantidad de memoria para su matriz de bytes. Así que a veces vale la pena recorrer alrededor de un .Leer(..) y tomar de él lentamente. Por supuesto, que todo depende de su tamaño de archivo. 🙂
    • Y depende de lo que usted desea hacer con el archivo – si usted puede procesar en trozos, entonces definitivamente debería de pagar para leer de forma incremental como usted sugiere. Buena llamada.
    • Esto se producirá si el archivo está abierto por otro proceso, el OP método de trabajo con la adición de FileShare.ReadWrite después de File.Read

  2. 27
    byte[] bytes = File.ReadAllBytes(filename) 

    o …

    var bytes = File.ReadAllBytes(filename) 
    • Vienen en. De todos modos, voy a cambiar si te hace sentir mejor.
    • En serio? ‘var’ es perfectamente aceptable, en este caso, el tipo de retorno se indica claramente en el nombre del método…
    • suspiro, que se cambió demasiado rápido, no me puedo quitar de la votación todavía (voy a tener que editarlo). Es mi opinión personal es que var debe utilizarse sólo cuando sea absolutamente necesario, y yo lo expresó a través de la votación, eso es todo 🙂
    • Erik: me glaseado sobre los nombres de método, sólo miro a los tipos. Obviamente se puede deducir muy fácilmente desde el nombre de la variable, y el IDE de sí mismo, y tantas otras cosas; simplemente estoy expresando preferencias personales.
    • Así, sólo el uso de ‘var’ cuando el uso de tipos anónimos?
    • Gracias Erik – me gusta el uso de «var» y en este caso se trataba de un par de golpes más cortos. Supongo que el OP iba a obtener la esencia de todos modos.
    • +1 para que originalmente usando var. Es mi opinión personal (y la de muchos otros), que debe ser usado tanto como sea posible. 🙂 Que el asunto ha sido discutido varias veces en este sitio antes, de hecho.
    • pero gracias por explicar el downvote. Muy pocos lo hacen.
    • Lo siento si me encontré con el argumento – simplemente he conocido nunca a nadie con particular preferencia antes. Es un poco desconcertante para ser honesto. Yo no uso se en todas partes que puedo (lo siento Noldorin) pero yo trato de usar en cualquier lugar que el tipo puede ser inferida a partir de su inicialización.
    • Esperemos que todo el mundo es feliz ahora.
    • También +1 para el uso de var… @sedoso, supongo que todo el mundo es libre de tener una opinión sobre si el uso o no de las nuevas características del lenguaje cuando se presentó, pero downvoting una respuesta porque no se ajustan a su opinión no es lo que yo pensaba que este foro era. ciertamente tiene poco que ver con JLs pregunta.
    • Creo que usted debe considerar más que las preferencias personales cuando downvoting. Esto es perfectamente válido respuesta, con o sin var. Tiendo a pensar que cualquier programador que necesita de forma manual y deletrear explícitamente los tipos de trabajo a un nivel demasiado bajo de abstracción. No asunto lo que el tipo exacto de la variable, solo lo que la variable es. Si almacena los bytes del archivo, entonces eso debe ser lo que importa. No se si es una Lista o una Matriz o MyCustomContainer.
    • Carlos: Bueno, está mal en su segunda declaración. Pero me niego a perder más tiempo discutiendo; yo creo que un hombre razonable puede determinar la razón de mi downvoting (aunque yo también lo dijo).
    • La declaración Final como parece que de lo que yo considero que es obvio es que no: me votada abajo, porque yo considerar que hace el código confundir con ningún beneficio. Además, el sistema de votación que permite a mí (y a todos nosotros) para colocar puestos en un orden que ellos piensan que es más relevante para el OP, y los lectores de la página web en el gran. En mi opinión, el uso de var por ninguna razón, no es buena; por lo tanto el votada abajo, y mi upvote sobre la aceptada respuesta. Permítanos nota además de que mi voto también es retirado de este post, sin tener en cuenta. No más hay que decir.
    • Me doy cuenta de que este diálogo se ha vuelto un poco fuera de la pista, pero aquí es una pregunta sincera. ¿Qué significa «ser utilizado sólo cuando sea absolutamente necesario»? Es el var nunca absolutamente necesario? Siempre se puede hacer anónimos los tipos explícitos (como mucho un dolor como lo sería) y aun en ese caso no es «absolutamente necesario». Y de acuerdo con sus preferencias, su downvote es comprensible.
    • Jason: yo voy a ser sincero, yo no uso 3.5 mucho, e incluso cuando lo hago, no me encuentro a mí mismo usando var. Yo no uso un montón de LINQ o clases anónimas, así que no puedo hablar directamente de cuándo sería específicamente es necesario, pero esos son los casos que estoy pensando (LINQ y clases anónimas).
    • Si el var había sido en absoluto relevante para la respuesta real, discutiendo sobre el uso de la misma habría tenido sentido. Pero aquí, la parte importante de la respuesta es solo File.ReadAllBytes(filename). ¿Y si el resultado es almacenado en una variable es tan irrelevante como el nombre de la variable, o el espacio después de la =.
    • Este votante (sedoso) tiene una preferencia que el var no se utilizará a menos que sea absolutamente necesario. Esto es, dados dos idénticos puestos, pero donde uno de los usos byte[] bytes = File.ReadAllBytes(filename) y de otros usos,var bytes = File.ReadAllBytes(filename), prefiere los primeros sobre los segundos. Es decir, él prefiere que el ex puesto más alto que el segundo. Por lo tanto, para expresar su preferencia, debe downvote el uso de var. Usted no puede utilizar el sistema de votación de esa manera, pero es perfectamente razonable utilizar el sistema de voto para expresar su preferencia.
    • Yo personalmente como para evitar el uso de var sólo por lo que el tipo es evidente, si se conoce. Así que lo evito como la peste por esa razón – no me gusta adivinar el tipo de retorno de un objeto, o cómo lo echó, y se remontan a más de alguien código para averiguar. Dicho esto, yo nunca lo haría, nunca downvote una persona del post aquí para usarla, ya que a veces es sólo para guardar algunas pulsaciones de teclas cuando el OP, obviamente, saber de qué tipo era la intención.
    • Supongo que yo estaba bajo la impresión de que downvoting una respuesta significaba que no responde a la pregunta original. En este caso, el var es una respuesta correcta, así como byte[], por lo tanto ambas son respuestas correctas. Parece una locura para mí DOWNVOTE una respuesta que sea correcta.

  3. 12

    De no repetir lo que todos ya han dicho, pero mantener en la siguiente hoja de trucos de bolsillo para las manipulaciones de Archivo:

    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);
  4. 5

    Todas estas respuestas con .ReadAllBytes(). Otro similar (no voy a decir duplicado, ya que estaban tratando de refactorizar el código) se preguntó sobre LO aquí: La mejor manera de leer un archivo de gran tamaño en una matriz de bytes en C#?

    Un comentario fue realizado en uno de los postes con respecto a la .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 método mejor, 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 eso es sólo conmigo…

    Por supuesto, todo esto se supone que tiene la memoria para manejar la byte[] una vez que se lee, y yo no he puesto en el File.Exists asegúrese de que el archivo está ahí antes de continuar, te gustaría hacer que antes de llamar a este código.

    • Hay un error en su código, usted no necesita la nueva en el uso de la declaración debe usar (FileStream fs = Archivo.OpenRead(nombre de archivo)
    • No tanto un error (creo que el código se compilará) pero me lo quitaron todo el mismo. Buena captura.
  5. 3

    se ve bastante bueno como una versión genérica. Usted puede modificarlo para satisfacer sus necesidades, si son lo suficientemente específicos.

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

    usted también puede hacer lo siguiente para ahorrar algo de espacio:

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

    Otros han señalado que se puede utilizar el built-in File.ReadAllBytes. El método integrado es buena, pero vale la pena señalar que el código post anterior es frágil por dos razones:

    1. Stream es IDisposable – se debe colocar el FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read) la inicialización en el uso de la cláusula para garantizar que el archivo está cerrado. El no hacer esto puede significar que la corriente permanece abierta si se produce un error, lo cual significa que el archivo queda bloqueado y que puede causar otros problemas más adelante.
    2. fs.Read puede leer menos bytes que usted solicita. En general, la .Read método de un Stream instancia de leer al menos un byte, pero no necesariamente todos los bytes que usted pide. Tendrás que escribir un bucle en el que el número de reintentos de lectura hasta que todos los bytes se leen. Esta página explica esto con más detalle.

Dejar respuesta

Please enter your comment!
Please enter your name here