我在网上找到了以下代码:
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
}
在c#中使用将文件转换为byte []是否足够可靠,或者有更好的方法吗?
答案 0 :(得分:197)
byte[] bytes = System.IO.File.ReadAllBytes(filename);
这应该可以解决问题。 ReadAllBytes打开文件,将其内容读入新的字节数组,然后关闭它。这是该方法的MSDN page。
答案 1 :(得分:26)
byte[] bytes = File.ReadAllBytes(filename)
或......
var bytes = File.ReadAllBytes(filename)
答案 2 :(得分:12)
不要重复每个人已经说过的内容,但请妥善保管以下备忘单以进行文件操作:
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);
答案 3 :(得分:3)
作为通用版本看起来不错。如果它们足够具体,您可以对其进行修改以满足您的需求。
还测试异常和错误条件,例如文件不存在或无法读取等等。
您还可以执行以下操作以节省一些空间:
byte[] bytes = System.IO.File.ReadAllBytes(filename);
答案 4 :(得分:3)
所有这些答案均为.ReadAllBytes()
。另一个,类似的(我不会说重复,因为他们试图重构他们的代码)问题在这里被问到:Best way to read a large file into a byte array in 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
检查以确保文件在那里继续,正如你在调用此代码之前那样做。
答案 5 :(得分:2)
其他人已经注意到您可以使用内置的File.ReadAllBytes
。内置方法很好,但值得注意的是,上面发布的代码很脆弱,原因有两个:
Stream
是IDisposable
- 您应该将FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read)
初始化放在using子句中以确保文件已关闭。如果不这样做可能意味着如果发生故障,流仍然保持打开状态,这意味着文件仍然处于锁定状态 - 这可能会导致其他问题。fs.Read
可能会读取比您请求的更少的字节数。通常,.Read
实例的Stream
方法将读取至少一个字节,但不一定是您要求的所有字节。您需要编写一个重试读取的循环,直到读取所有字节为止。 This page更详细地解释了这一点。