比Windows Mobile的SharpZipLib更好的gzip工具?

时间:2010-02-13 07:51:16

标签: c# windows-mobile compact-framework gzip sharpziplib

我在用##

编写的 Windows Mobile 应用程序上使用SharpZipLib进行gzip

我有这段代码

public static bool gzDecompressFile(String inputFilePath, String outputFilePath)
        {
            if (!File.Exists(inputFilePath))
                return false;

            if (File.Exists(outputFilePath))
                File.Delete(outputFilePath);


            FileStream fs = File.OpenRead(inputFilePath);
            FileStream fsOut = File.OpenWrite(outputFilePath);

            GZipInputStream gzipIn = new GZipInputStream(fs);

            // Compress file in 1kb chunks
            byte[] chunk = new byte[1024];
            int read = 1;

            while (read > 0)
            {
                read = gzipIn.Read(chunk, 0, chunk.Length);

                if (read > 0)
                {
                    fsOut.Write(chunk, 0, read);
                }
            }

            fsOut.Close();
            fs.Close();

            return true;
        }

对于1.6MB - > 7MB减压需要4-5分钟 你知道 Compact Framework 更好吗?

3 个答案:

答案 0 :(得分:2)

在4分钟内将1.6MB压缩到7MB非常慢。

想到的一些事项:

  1. 您是否尝试过更改工作缓冲区的大小? 1KB是非常保守的恕我直言。使用GZip解压缩算法可能会遇到性能问题(但这只是一个WAG)。
  2. 是否存储了临时文件,如果存储,在哪里?它们是在内存中还是在存储设备上?如果在存储设备上,哪一个可能具有不同的性能特征。
  3. 您可以通过双缓冲提高性能。这通过创建两个缓冲区来工作,而一个正在从读取中填充,另一个正在被写入刷新(乒乓效应,需要异步代码)。它只会与最慢的操作(解压缩的流读取)一样快,但您可能能够消除累积的写入延迟。
  4. 我们最初使用SharpLibZip,但切换到商业Xceed ZIP.NET库以利用批处理功能(以及对.NET和.NET Compact Frameworks的支持)。 Xceed库也支持GZip。即使在我们过时的400 MHz Windows CE 4.2设备上,我们只需要大约20-30秒来解压缩一个6 MB的文件(尽管使用XCeed ZIP.NET在ZIP中)。

    另外,如果我没弄错的话,我相信.NET Compact Framework支持GZip。在旁注中,将FileStream放在using语句中,以确保在方法中间发生异常时关闭它们。

答案 1 :(得分:1)

压缩非常占用CPU。可能是......那需要多长时间。

尝试DotNetZip - 不确定是否更快,但它是免费的,易于尝试。 DotNetZip中有一个GZipStream,它取代了.NET BCL中的GZipStream。

由于您正在进行GZIP而不是ZIP,因此您只需要Ionic.Zlib.dll,而不是Ionic.Zip.dll。前者是后者的严格子集。


编辑:代码示例

using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress))
{
    using (var raw = System.IO.File.Create(outputFile))
    {
        using (Stream compressor = new GZipStream(raw, CompressionMode.Compress))
        {
            byte[] buffer = new byte[WORKING_BUFFER_SIZE];
            int n;
            while ((n= input.Read(buffer, 0, buffer.Length)) != 0)
            {
                compressor.Write(buffer, 0, n);
            }
        }
    }
}

(上面代码中的GZipStream由Ionic.Zlib.dll提供。)

答案 2 :(得分:0)

我将ZIP组件用作Resco Mobile Toolkit的一部分:http://www.resco.net/developer/mobileformstoolkit/overview.aspx

工具包的价格可能过高 - 这取决于您是否需要任何其他控件。