1

我基本上是直接从 msdn 复制了这个代码示例,并进行了一些最小的更改。该CopyTo方法默默地失败了,我不知道为什么。什么会导致这种行为?它正在传递一个 78 KB 的压缩文件夹,其中包含一个文本文件。返回的FileInfo对象指向一个 0 KB 的文件。不抛出异常。

    public static FileInfo DecompressFile(FileInfo fi)
    {
        // Get the stream of the source file.
        using (FileStream inFile = fi.OpenRead())
        {
            // Get original file extension, 
            // for example "doc" from report.doc.cmp.
            string curFile = fi.FullName;
            string origName = curFile.Remove(curFile.Length
                    - fi.Extension.Length);

            //Create the decompressed file.
            using (FileStream outFile = File.Create(origName))
            {
                // work around for incompatible compression formats found
                // here http://george.chiramattel.com/blog/2007/09/deflatestream-block-length-does-not-match.html
                inFile.ReadByte();
                inFile.ReadByte();

                using (DeflateStream Decompress = new DeflateStream(inFile,
                    CompressionMode.Decompress))
                {
                    // Copy the decompression stream 
                    // into the output file.
                    Decompress.CopyTo(outFile);

                    return new FileInfo(origName);
                }
            }
        }
    }
4

1 回答 1

2

在评论中,您说您正在尝试解压缩 zip 文件。DeflateStream不能像这样在 zip 文件上使用该类。您提到的MSDN 示例DeflateStream用于创建单独的压缩文件,然后解压缩它们。

尽管 zip 文件可能使用相同的算法(不确定),但它们不仅仅是单个文件的压缩版本。zip 文件是可以容纳许多文件和/或文件夹的容器。

如果您可以使用 .NET Framework 4.5,我建议您使用 newZipFileZipArchive类。如果您必须使用较早的框架版本,可以使用免费库(如DotNetZipSharpZipLib)。

于 2013-10-03T19:03:35.370 回答