【发布时间】:2011-11-11 21:39:24
【问题描述】:
我正在编写一个控制台应用程序来压缩一个包含大文件(大约 30 个)的目录,每个文件大约 100-300 MB,这将每天执行一次(随着新文件的进入)。我尝试使用内置的 GZipStream 类,每个文件大约需要 15 秒,压缩比约为 0.212。我想知道第三方库是否有更有效的方法,或者是否有某种方法可以提高压缩率。最后,线程是加快这个过程的一个选项吗?
这是我目前使用的代码(基本上来自 GZipStream 上的 MSDN 文章)
private void CompressFile(FileInfo fileInfo)
{
// Get the stream of the source file.
using (FileStream inFile = fileInfo.OpenRead())
{
Timer.Reset();
// Prevent compressing hidden and
// already compressed files.
if ((File.GetAttributes(fileInfo.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden & fileInfo.Extension != ".gz")
{
// Create the compressed file.
using (FileStream outFile = File.Create(fileInfo.FullName + ".gz"))
{
using (GZipStream Compress = new GZipStream(outFile, CompressionMode.Compress))
{
// Copy the source file into
// the compression stream.
Timer.Start();
inFile.CopyTo(Compress);
Timer.Stop();
Console.WriteLine("Compressed {0} from {1} to {2} bytes in {3} seconds.",
fileInfo.Name, fileInfo.Length.ToString(), outFile.Length.ToString(), ((double)Timer.ElapsedMilliseconds / 1000));
}
}
}
}
}
谢谢!
【问题讨论】:
-
文件之间是否有任何已知的重叠,还有什么可以用来进一步逻辑压缩内容的吗?
-
让 Windows 来做这件事。右键单击文件夹,属性,高级,勾选“压缩内容”选项。
-
@HansPassant 那么编程的潜在性能收益不值得麻烦吗? (另外,我假设有一种方法可以安排窗口来执行此操作?)
-
Windows 可以很多 更有效地执行此操作,它发生在后台内核工作线程上。无需安排,您将其打开,它将始终处于活动状态。文件数据在写入磁盘时会被压缩。并在您阅读时自动解压缩。
-
@HansPassant 很酷,谢谢我不知道
标签: c# .net-4.0 compression console-application