【问题标题】:Issue reading file to byte array向字节数组发出读取文件
【发布时间】:2017-06-16 11:51:21
【问题描述】:

我正在维护一个程序,该程序具有以下代码来将文件读取到字节数组:

using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
{
    fileStream.Position = 0;

    int fileSize = (int)fileStream.Length;
    int readSize;
    int remain = fileSize;
    var pos = 0;

    byteData = new byte[fileSize];

    while (remain > 0)
    {
        readSize = fileStream.Read(byteData, pos, Math.Min(1024, remain));
        pos += readSize;
        remain -= readSize;
    }
}

然后将这个字节数组输出为 Base64 字符串:

var value = "File contents:" + Environment.NewLine + Convert.ToBase64String(byteData)

我们偶尔会看到的问题是输出只是一串 A,例如“AAAAAAAAAAAAAAAAAAAAAA”,但更长。我发现如果你输出一个已初始化为给定长度但未分配值的字节数组(即每个字节仍然是初始值 0),它将在 Base64 中作为一系列 A 输出,所以我的假设是根据文件大小创建字节数组,但是没有分配每个字节的值。虽然看代码我看不出有任何明显的问题,所以如果有人知道更好,我将非常感激。

【问题讨论】:

  • 你的byteData数组被初始化为fileSize的大小,也就是整个文件的长度。这样做会破坏像您所做的那样以块加载文件的目的。将您的数组初始化为块大小(在您的代码中显示为 1024)或仅使用 File.ReadAllBytes
  • @Abion47 代码的重点是要有一个包含文件全部内容的字节数组,所以它当然首先将数组初始化为整个文件的长度。我不知道为什么它将块大小限制为最大 1024 字节。 File.ReadAllBytes 很可能是读取文件内容的另一种(且更简单)方法,但除非我能了解问题的原因,否则我会在没有充分理由的情况下更改生产代码。
  • 它将块大小限制为 1024,因为这是 fileStream.Readlength 参数中的数字。但是该方法是用于一次读取文件的一部分。如果您的目标只是将整个文件读入单个数组,那么这种方法就太过分了,我建议您只使用File.ReadAllBytes。话虽如此,如果您使用 pos 的值作为进度条的输入,您的方法也是理想的。
  • @Abion47 我的意思是我不知道为什么代码的作者决定限制块大小。但是不,不使用pos 作为进度条,所以File.ReadAllBytes 显然是一个更好的解决方案,因为它更简单。但就像我说的,除非有理由认为现有代码有缺陷(而不是过度杀伤),否则我仍然犹豫是否要更改它。
  • 更改代码的四个原因:1)对工作来说太过分了; 2)它给操作增加了一定的开销; 3)增加的复杂性并没有提供任何额外的好处来抵消复杂性成本; 4)它偶尔会产生错误的输出。这对我来说已经足够了。

标签: c# arrays io filestream


【解决方案1】:

为了后代,我最终将其更改为File.ReadAllBytes,但我也发现问题出在文件本身,空字节数组实际上是正确的。 IE。每个字节还是0的初始值,所以对应的base64字符串“A”也是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-13
    • 2013-07-31
    • 2023-03-08
    • 2021-12-14
    • 2014-03-30
    • 2011-12-04
    • 1970-01-01
    • 2016-06-22
    相关资源
    最近更新 更多