我有代码,这是用C#编写的压缩文件的SSIS脚本任务。
在压缩1gb文件时,我遇到了问题。
我尝试实现这段代码,但仍然得到错误“System.OutOfMemoryException”
System.OutOfMemoryException:抛出了“System.OutOfMemoryException”类型的异常。 在ST_4cb59661fb81431abcf503766697a1db.ScriptMain.AddFileToZipUsingStream(String sZipFile,c:\Users\dtmp857\AppData\Local\Temp\vsta\84bef43d323b439ba25df47c365b5a29\ScriptMain.cs:line 333中的String sFilePath,String sFileName,String sBackupFolder,String sPrefixFolder) 在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;
}我缺少的东西,请给我建议,也许指导或最佳实践处理这个问题。
发布于 2021-05-20 16:47:06
我知道这是一篇老文章,但我该怎么说呢,它帮助我整理了一些东西,但仍然是谷歌的热门话题。
所以System.IO.Compression库肯定有问题!首先也是最重要的..。
您必须确保关闭32首选的。拥有这个集合(在我的例子中,构建为"AnyCPU")会导致许多不一致的问题。
现在,我使用了一些演示文件(几个小于500 of,一个小于500 of,一个在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损坏的文件更多!
我的意思是,在我的文件中,500 my和1GB文件最终被压缩到压缩存档中,但大小小于原始文件(基本上是截断的)。
所以我不知道。因为现在的32位操作系统已经不多了,我想这可能是个未知数。
但是似乎在System.IO.Compression框架中有一些But!
https://stackoverflow.com/questions/35423005
复制相似问题