Надежный способ преобразования файла в байт[]
Я нашел следующий код в интернете:
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 ответов:
byte[] bytes = System.IO.File.ReadAllBytes(filename);
это должно сделать трюк. ReadAllBytes открывает файл, считывает его содержимое в новый массив байтов, а затем закрывает его. Вот это страница MSDN для этого метода.
не повторять то, что все уже сказали, но держать следующую шпаргалку handly для манипуляций с файлами:
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);
выглядит достаточно хорошо в качестве общей версии. Вы можете изменить его в соответствии с вашими потребностями, если они достаточно специфичны.
также Тест для исключения и ошибки, такие как файл не существует или не может быть прочитан и т. д.
вы также можете сделать следующее, Чтобы сэкономить пространство:
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
. Встроенный метод прекрасен, но стоит отметить, что код, который вы публикуете выше, хрупок по двум причинам:
Stream
иIDisposable
- вы должны поставить тегFileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read)
инициализация в предложении using для обеспечения закрытия файла. В противном случае поток может остаться открытым, если произойдет сбой, что будет означать, что файл остается заблокированным - и это может вызвать другие проблемы позже на.fs.Read
может прочитать меньше байт, чем вы просите. В общем, то.Read
метод aStream
экземпляр будет читать по крайней мере один байт, но не обязательно все байты, которые вы просите. Вам нужно будет написать цикл, который повторяет чтение, пока все байты не будут прочитаны. на этой странице объясняет это более подробно.