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

JL.*_*JL. 78 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
}
Run Code Online (Sandbox Code Playgroud)

它是否足够可靠,可以在c#中将文件转换为byte [],还是有更好的方法可以做到这一点?

Eri*_*bes 206

byte[] bytes = System.IO.File.ReadAllBytes(filename);
Run Code Online (Sandbox Code Playgroud)

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

  • 只有*minor*问题是,如果你有一个大文件(比如说500MB或1GB等),它会为你的字节数组分配那么多内存.因此,有时需要循环使用.Read(..)并慢慢取出它.当然,这一切都取决于您的文件大小.:) (4认同)
  • 如果文件被另一个进程打开,这将失败,OP方法将在`File.Read`之后添加`FileShare.ReadWrite`. (3认同)
  • 不,它不会 - 文件在填充字节数组后立即关闭. (2认同)

Bri*_*sen 27

byte[] bytes = File.ReadAllBytes(filename) 
Run Code Online (Sandbox Code Playgroud)

要么 ...

var bytes = File.ReadAllBytes(filename) 
Run Code Online (Sandbox Code Playgroud)

  • 真的吗?在这种情况下,'var'是完全可以接受的 - 返回类型在方法名称中明确说明...... (13认同)
  • 同样+1使用var ... @silky,我想每个人都可以自由地对是否在引入时使用新语言功能有所了解,但是因为它不符合你的观点而不能回答你的意见我认为这个论坛是关于什么的.它肯定与JLs问题没什么关系. (8认同)
  • 如果`var`与实际答案完全相关,争论使用它会有意义.但在这里,答案的重要部分只是`File.ReadAllBytes(filename)`.如何以及如果结果存储在变量中与变量的命名或`=`之后的空格无关. (8认同)
  • 我认为你在downvoting时应该考虑的不仅仅是个人偏好.这是一个非常有效的答案,有或没有`var`.我倾向于认为任何需要手动和明确拼写类型的程序员都处于过低的抽象层次.它应该不重要*变量的精确类型是什么,只是变量*是*.如果它存储文件中的字节,那么这应该是重要的.不管它是List还是Array或MyCustomContainer. (6认同)
  • +1最初使用`var`.这是我个人的意见(以及许多其他意见),应该尽可能地使用它.事实上,此事已在本网站上多次讨论过. (4认同)
  • 谢谢埃里克 - 我喜欢使用“var”,在这种情况下,它更短了几笔。我认为无论如何 OP 都会得到要点。 (2认同)
  • 最后的声明似乎我认为显而易见的不是:我投了反对票,因为*我*认为它使代码混乱而没有任何好处。此外,投票系统允许我(和我们所有人)按照他们认为与 OP 和网站读者*最相关的顺序发布帖子。在我看来,无缘无故使用 var 是不好的;因此被否决了,而我对接受的答案投了赞成票。让我们进一步注意,无论如何,我的投票也从这个特定的帖子中撤回。不用多说了。 (2认同)
  • @jalf:这个选民(丝滑)有一个偏好,除非绝对必要,否则不能使用var.也就是说,给定两个相同的帖子,但是其中一个使用`byte [] bytes = File.ReadAllBytes(filename)`而另一个使用`var bytes = File.ReadAllBytes(filename)`,他更喜欢前者而不是后者.也就是说,他更希望前者的排名高于后者.因此,为了表达他的偏好,他应该使用`var`进行投票.您可能不会以这种方式使用投票系统,但完全合理地使用投票系统来表达他的偏好. (2认同)
  • 我个人喜欢避免使用“var”,这样类型就很明显(如果已知的话)。因此,出于这个原因,我像躲避瘟疫一样避免它 - 我不喜欢猜测对象的返回类型,或者如何转换它,并追溯某人的代码来找出答案。也就是说,我永远不会因为使用它而对某人的帖子投反对票,因为有时这只是为了节省一些击键,而OP显然知道想要什么类型。 (2认同)

Viv*_*vek 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);


vap*_*guy 5

所有这些答案都带有.ReadAllBytes()。在这里对SO提出了另一个类似的问题(我不会说重复,因为他们正试图重构其代码): 在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
Run Code Online (Sandbox Code Playgroud)

对我来说,更好的方法是这样的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;
}
Run Code Online (Sandbox Code Playgroud)

但这就是我...

当然,所有这些都假定您有足够的内存来处理byte[]读入File.Exists的文件,而在进行此操作之前,我没有进行检查以确保文件在此处,因此您可以在调用此代码之前这样做。