我有一个保存文件到文件夹(大约有 20 万个小文件)的 WCF Web 服务。之后,我需要将它们移动到另一台服务器上。
我找到的解决方案是将它们压缩然后再移动。
当我采用这个解决方案时,我进行了 (20,000 个文件) 的测试,压缩 20,000 个文件只需要大约 2 分钟,移动 zip 文件非常快。但在生产环境中,压缩 200,000 个文件需要超过 2 小时。
以下是我的压缩文件夹代码:
using (ZipFile zipFile = new ZipFile())
{
zipFile.UseZip64WhenSaving = Zip64Option.Always;
zipFile.CompressionLevel = CompressionLevel.None;
zipFile.AddDirectory(this.SourceDirectory.FullName, string.Empty);
zipFile.Save(DestinationCurrentFileInfo.FullName);
}
我想修改WCF Web服务,使其不再保存到文件夹,而是保存到zip文件中。
我使用以下代码进行测试:
var listAes = Directory.EnumerateFiles(myFolder, "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".aes")).Select(f => new FileInfo(f));
foreach (var additionFile in listAes)
{
using (var zip = ZipFile.Read(nameOfExistingZip))
{
zip.CompressionLevel = Ionic.Zlib.CompressionLevel.None;
zip.AddFile(additionFile.FullName);
zip.Save();
}
file.WriteLine("Delay for adding a file : " + sw.Elapsed.TotalMilliseconds);
sw.Restart();
}
第一个文件添加到压缩包只需要5毫秒,但第10000个文件需要800毫秒。
有没有什么方法可以优化这个过程?或者您有其他建议吗?
编辑
上面显示的示例仅用于测试,在WCF webservice中,我将有不同的请求发送文件,需要将其添加到Zip文件中。 由于WCF是无状态的,每次调用都会有一个新的类实例,那么如何保持Zip文件打开以添加更多文件?