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