<注意:本回答假设您可以分块处理最终的base 64字符串,例如通过将每个块依次写入某种流中进行处理。>
如果您编写一个帮助方法来读取文件并将其分块为最大大小的byte[]
块,则此过程将变得简化,例如:
public static IEnumerable<byte[]> ReadFileInBlocks(string filename, int blockSize)
{
byte[] buffer = new byte[blockSize];
using (var file = File.OpenRead(filename))
{
while (true)
{
int n = file.Read(buffer, 0, buffer.Length);
if (n == buffer.Length)
{
yield return buffer;
}
else if (n > 0)
{
Array.Resize(ref buffer, n);
yield return buffer;
break;
}
else
{
break;
}
}
}
}
然后,您可以编写一个简单的方法,依次从文件中每个字节块转换为一系列Base64字符串。
public static IEnumerable<string> ToBase64Strings(string filename, int blockSize)
{
return ReadFileInBlocks(filename, blockSize).Select(Convert.ToBase64String);
}
假设您有一种处理每个转换后的Base-64字符串块的方法,那么请按照以下步骤操作:
foreach (var base64String in ToBase64Strings(myFilename, 1024))
process(base64String);
或者,您可以跳过中介的ReadFileInBlocks()
方法,并将转换为base 64字符串的步骤合并到其中,如下所示:
public IEnumerable<string> ConvertToBase64StringInBlocks(string filename, int blockSize)
{
byte[] buffer = new byte[blockSize];
using (var file = File.OpenRead(filename))
{
while (true)
{
int n = file.Read(buffer, 0, buffer.Length);
if (n == 0)
{
break;
}
else
{
yield return Convert.ToBase64String(buffer, 0, n);
}
}
}
}