【发布时间】:2018-07-22 10:44:43
【问题描述】:
当我尝试对包含一些视频的 .zip 文件夹执行以下操作时,我会出现内存不足的异常。
Byte[] bytes = File.ReadAllBytes(@"C:\folderWithVideos.zip");
String base64File= Convert.ToBase64String(bytes);//<----- out of memory exception
如何正确处理这个异常?我的意思是没有try-catch,我尝试过类似的方法:
String base64File;
if (bytes.Length <= System.Int32.MaxValue)
base64File = Convert.ToBase64String(bytes);
但它没有帮助,但 bytes.Length <= 255 确实有帮助,但我不确定 255 是正确的数字。
【问题讨论】:
-
您尝试 Base64 的 Zip 文件有多大?
-
我很好奇你为什么要首先对文件进行编码。
-
您的代码不会在 ReadAllBytes() 上崩溃的唯一原因是您在 64 位操作系统上运行程序。使用 Project > Properties > Build 选项卡并取消选中“Prefer 32-bit”以避免在 ToBase64String() 调用上崩溃。这段代码的实用性很低,任何需要吞下这条巨大字符串的程序都会以同样的方式烧毁。
-
@IOException 我们到了那个时候:-) 你写了一个经典的XY question。您不想将大文件转换为 b64。您想将大文件上传到需要 b64 格式的 API。现在...根据您调用 API 的方式(可能是 Web 服务),有可能解决这个问题,这是一个与您提出的问题不同的问题。
-
不要整体读写,而是流式传输。所以创建一个文件流来打开文件,按块读取它(因为 Base64 通过将 3 个字节转换为 4 个字符,块大小必须能被 3 整除),将块转换为 Base64,将 Base64 字符串写入您的 API 网络流,继续下一个块等等。这样你的内存消耗就会受到块大小的限制。
标签: c#