Надежный способ преобразования файла в байт []

Я нашел следующий код в Интернете:

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
}

Достаточно ли он достаточно, чтобы использовать для преобразования файла в байт [] в С#, или есть лучший способ сделать это?

Ответ 1

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

Это должно сделать трюк. ReadAllBytes открывает файл, считывает его содержимое в новый массив байтов, а затем закрывает его. Здесь страница MSDN для этого метода.

Ответ 2

byte[] bytes = File.ReadAllBytes(filename) 

или...

var bytes = File.ReadAllBytes(filename) 

Ответ 3

Не повторять то, что все уже сказали, но держите следующий чит-лист вручную для манипуляций с файлами:

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

Ответ 4

выглядит достаточно хорошо как общая версия. Вы можете изменить его в соответствии с вашими потребностями, если они достаточно конкретны.

также проверять исключения и условия ошибки, такие как файл не существует или не может быть прочитан и т.д.

вы также можете сделать следующее, чтобы сохранить некоторое пространство:

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

Ответ 5

Другие отметили, что вы можете использовать встроенный File.ReadAllBytes. Встроенный метод хорош, но стоит отметить, что код, который вы публикуете выше, является хрупким по двум причинам:

  • Stream IDisposable - вы должны поместить инициализацию FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read) в предложение use, чтобы гарантировать, что файл закрыт. Несоблюдение этого может означать, что поток остается открытым, если происходит сбой, что будет означать, что файл остается заблокированным - и это может вызвать другие проблемы позже.
  • fs.Read может читать меньше байтов, чем вы запрашиваете. В общем случае метод .Read экземпляра Stream будет читать как минимум один байт, но не обязательно все байты, которые вы запрашиваете. Вам нужно будет написать цикл, который повторяет чтение до тех пор, пока не будут прочитаны все байты. Эта страница объясняет это более подробно.

Ответ 6

Все эти ответы .ReadAllBytes(). Другой, похожий (я не буду повторять дубликат, так как они пытались реорганизовать свой код), вопрос был задан здесь: Лучший способ чтения большого файла в массив байтов в С#?

Прокомментировано одно из сообщений о .ReadAllBytes():

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

Лучший подход, для меня, был бы чем-то вроде этого: BinaryReader:

public static byte[] FileToByteArray(string fileName)
{
    byte[] fileData = null;

    using (FileStream fs = new File.OpenRead(fileName)) 
    { 
        var binaryReader = new BinaryReader(fs); 
        fileData = binaryReader.ReadBytes((int)fs.Length); 
    }
    return fileData;
}

Но это только я...

Конечно, все это предполагает, что у вас есть память для обработки byte[] после ее чтения, и я не поставил в тег File.Exists, чтобы убедиться, что файл существует, прежде чем продолжить.