System.IO.Compression.ZipArchive可处理大文件
本文关键字:文件 可处理 ZipArchive IO Compression System | 更新日期: 2023-09-27 18:34:40
我有一个代码是SSIS脚本任务,用于压缩用C#编写的文件。
我在压缩 1gb(大约(文件时遇到问题。
我尝试实现此代码,但仍然收到错误"System.OutOfMemoryException"
System.OutOfMemoryException:抛出类型为"System.OutOfMemoryException"的异常。
在ST_4cb59661fb81431abcf503766697a1db。ScriptMain.AddFileToZipUsingStream(String sZipFile, String sFilePath, String sFileName, String sBackupFolder, String sPrefixFolder( in c:''Users''dtmp857''AppData''Local''Temp''vsta''84bef43d323b439ba25df47c365b5a29''ScriptMain.cs:line 333
在ST_4cb59661fb81431abcf503766697a1db。ScriptMain.Main(( in c:''Users''dtmp857''AppData''Local''Temp''vsta''84bef43d323b439ba25df47c365b5a29''ScriptMain.cs:line 131
这是压缩文件时的代码片段:
protected bool AddFileToZipUsingStream(string sZipFile, string sFilePath, string sFileName, string sBackupFolder, string sPrefixFolder)
{
bool bIsSuccess = false;
try
{
if (File.Exists(sZipFile))
{
using (ZipArchive addFile = ZipFile.Open(sZipFile, ZipArchiveMode.Update))
{
addFile.CreateEntryFromFile(sFilePath, sFileName);
//Move File after zipping it
BackupFile(sFilePath, sBackupFolder, sPrefixFolder);
}
}
else
{
//from https://stackoverflow.com/questions/28360775/adding-large-files-to-io-compression-ziparchiveentry-throws-outofmemoryexception
using (var zipFile = ZipFile.Open(sZipFile, ZipArchiveMode.Update))
{
var zipEntry = zipFile.CreateEntry(sFileName);
using (var writer = new BinaryWriter(zipEntry.Open()))
using (FileStream fs = File.Open(sFilePath, FileMode.Open))
{
var buffer = new byte[16 * 1024];
using (var data = new BinaryReader(fs))
{
int read;
while ((read = data.Read(buffer, 0, buffer.Length)) > 0)
writer.Write(buffer, 0, read);
}
}
}
//Move File after zipping it
BackupFile(sFilePath, sBackupFolder, sPrefixFolder);
}
bIsSuccess = true;
}
catch (Exception ex)
{
throw ex;
}
return bIsSuccess;
}
我缺少什么,请给我建议,可能是教程或最佳实践处理此问题。
这是一个旧帖子,但我能说什么,它帮助我整理了一些东西,并且仍然是谷歌的热门歌曲。
所以System.IO.Compress库肯定有问题!首先也是最重要的...
您必须确保关闭 32-首选。拥有这个设置(在我的情况下是"AnyCPU"的构建(会导致很多不一致的问题。
话虽如此,我获取了一些演示文件(几个小于 500MB,一个为 500MB,一个为 1GB(,并创建了一个带有 3 个按钮的示例程序,这些按钮使用了 3 种方法。
Button 1 - ZipArchive.CreateFromDirectory(AbsolutePath, TargetFile);
Button 2 - ZipArchive.CreateEntryFromFile(AbsolutePath, RelativePath);
Button 3 - Using the [16 * 1024] Byte Buffer method from above
现在这就是它变得有趣的地方。(假设该程序被构建为"AnyCPU"并且没有 32 首选检查(...所有 3 种方法都可以在 Windows 64 位操作系统上运行,无论它有多少内存。
但是,一旦我在 32 位操作系统上运行相同的测试,无论它有多少内存,只有方法 1 有效!
方法 2和 3 因内存不足错误而爆炸,并且为了向其添加盐,方法 3(首选的分块方法(实际上比方法 #2 损坏了更多的文件!
搞砸了,我的意思是在我的文件中,500MB 和 1GB 文件最终出现在压缩存档中,但大小小于原始文件(基本上被截断了(。
所以我不知道...由于周围不再有很多 32 位操作系统,我想这可能是一个有争议的问题。
但似乎System.IO.Compression Framework中有一些错误!