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


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

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
}

достаточно ли надежно конвертировать файл в byte[] в c#, или есть лучший способ сделать это?

6 70
c#

6 ответов:

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

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

byte[] bytes = File.ReadAllBytes(filename) 

или ...

var bytes = File.ReadAllBytes(filename) 

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

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

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

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

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

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

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

комментарий был сделан на одном из сообщений, касающихся .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 = File.OpenRead(fileName)) 
    { 
        var binaryReader = new BinaryReader(fs); 
        fileData = binaryReader.ReadBytes((int)fs.Length); 
    }
    return fileData;
}

но это только мое мнение...

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

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

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