【发布时间】: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.Read的length参数中的数字。但是该方法是用于一次读取文件的一部分。如果您的目标只是将整个文件读入单个数组,那么这种方法就太过分了,我建议您只使用File.ReadAllBytes。话虽如此,如果您使用pos的值作为进度条的输入,您的方法也是理想的。 -
@Abion47 我的意思是我不知道为什么代码的作者决定限制块大小。但是不,不使用
pos作为进度条,所以File.ReadAllBytes显然是一个更好的解决方案,因为它更简单。但就像我说的,除非有理由认为现有代码有缺陷(而不是过度杀伤),否则我仍然犹豫是否要更改它。 -
更改代码的四个原因:1)对工作来说太过分了; 2)它给操作增加了一定的开销; 3)增加的复杂性并没有提供任何额外的好处来抵消复杂性成本; 4)它偶尔会产生错误的输出。这对我来说已经足够了。
标签: c# arrays io filestream