将文件转换为byte []的可靠方法

时间:2009-09-30 13:09:46

标签: c#

我在网上找到了以下代码:

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 []是否足够可靠,或者有更好的方法吗?

6 个答案:

答案 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)

不要重复每个人已经说过的内容,但请妥善保管以下备忘单以进行文件操作:

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

答案 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。内置方法很好,但值得注意的是,上面发布的代码很脆弱,原因有两个:

  1. StreamIDisposable - 您应该将FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read)初始化放在using子句中以确保文件已关闭。如果不这样做可能意味着如果发生故障,流仍然保持打开状态,这意味着文件仍然处于锁定状态 - 这可能会导致其他问题。
  2. fs.Read可能会读取比您请求的更少的字节数。通常,.Read实例的Stream方法将读取至少一个字节,但不一定是您要求的所有字节。您需要编写一个重试读取的循环,直到读取所有字节为止。 This page更详细地解释了这一点。