Moyen fiable de convertir un fichier en octet

J’ai trouvé le code suivant sur le web:

private byte [] StreamFile(ssortingng 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 } 

Est-il suffisamment fiable pour convertir un fichier en octet [] dans c #, ou existe-t-il un meilleur moyen de le faire?

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

Cela devrait faire l’affaire. ReadAllBytes ouvre le fichier, lit son contenu dans un nouveau tableau d’octets, puis le ferme. Voici la page MSDN pour cette méthode.

 byte[] bytes = File.ReadAllBytes(filename) 

ou …

 var bytes = File.ReadAllBytes(filename) 

Ne pas répéter ce que tout le monde a déjà dit, mais gardez la feuille de sortingche suivante à scope de main pour les manipulations de fichiers:

  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);

semble assez bon comme une version générique. Vous pouvez le modifier pour répondre à vos besoins, s’ils sont suffisamment spécifiques.

également tester les exceptions et les conditions d’erreur, telles que fichier n’existe pas ou ne peut pas être lu, etc.

Vous pouvez également effectuer les opérations suivantes pour économiser de l’espace:

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

D’autres ont noté que vous pouvez utiliser le File.ReadAllBytes . La méthode intégrée est correcte, mais il convient de noter que le code que vous publiez ci-dessus est fragile pour deux raisons:

  1. Stream est IDisposable – vous devez placer l’initialisation FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read) dans une clause using pour vous assurer que le fichier est fermé. Dans le cas contraire, le stream rest ouvert en cas de défaillance, ce qui signifie que le fichier rest verrouillé – ce qui peut entraîner d’autres problèmes par la suite.
  2. fs.Read peut lire moins d’octets que vous demandez. En général, la méthode .Read d’une instance Stream lit au moins un octet, mais pas nécessairement tous les octets que vous demandez. Vous devrez écrire une boucle qui relance la lecture jusqu’à ce que tous les octets soient lus. Cette page explique cela plus en détail.

Toutes ces réponses avec .ReadAllBytes() . Une autre question similaire (je ne dirai pas de doublon, car ils essayaient de refactoriser leur code) a été posée sur SO ici: Meilleure façon de lire un fichier volumineux dans un tableau d’octets en C #?

Un commentaire a été fait sur l’un des messages concernant .ReadAllBytes() :

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

Une meilleure approche, pour moi, serait quelque chose comme ça, avec BinaryReader :

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

Mais c’est juste moi …

Bien sûr, tout cela suppose que vous ayez la mémoire pour gérer l’ byte[] une fois qu’il est lu, et je n’ai pas placé la vérification File.Exists pour vous assurer que le fichier est là avant de continuer, comme vous le feriez auparavant. appeler ce code.