将文件转换为字节的可靠方法

我在网上find了以下代码:

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 [],还是有更好的方法来做到这一点?

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

这应该够了吧。 ReadAllBytes打开文件,将其内容读入一个新的字节数组,然后closures它。 这是该方法的MSDN页面 。

 byte[] bytes = File.ReadAllBytes(filename) 

要么 …

 var bytes = File.ReadAllBytes(filename) 

不要重复每个人都已经说过的话,但请保留以下备忘单,以便文件操作:

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

作为一个通用版本看起来不错。 如果他们足够具体,您可以修改它以满足您的需求。

还可以testingexception和错误情况,如文件不存在或不能被读取等。

您还可以执行以下操作来节省一些空间:

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

其他人已经注意到,你可以使用内置的File.ReadAllBytes 。 内置的方法是好的,但值得注意的是,你上面发布的代码是脆弱的,有两个原因:

  1. StreamIDisposable – 您应该将FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read)初始化放在using子句中以确保文件已closures。 不这样做可能意味着如果发生故障,stream将保持打开状态,这将意味着文件保持locking状态 – 这可能会在以后导致其他问题。
  2. fs.Read可能会读取比您请求更less的字节。 一般情况下, Stream实例的.Read方法将读取至less一个字节,但不一定要求所有字节。 您需要编写一个循环,重试读取,直到读取所有字节。 本页面更详细地解释了这一点。

所有这些答案与.ReadAllBytes() 。 另一个,类似的(我不会说重复,因为他们试图重构他们的代码)问题是在这里问: 最好的方式来读取一个大的文件到C#中的字节数组?

对其中一个关于.ReadAllBytes()的post发表了.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检查,以确保文件在那里继续之前。