如何在IIS 6中运行的 Asp.net 2.0中的Zip /Compress目录(文件夹)?

How Zip/Compress directory(folder) in Asp.net 2.0 that runs in IIS 6?

提问人: 提问时间:12/31/2022 更新时间:2/22/2023 访问量:152

问:

我想将包含多个文件的目录(文件夹)压缩为在 IIS 6 中运行的 Asp.net 2 中的 (.zip) 文件,但我无法升级我的 .net 版本,因为我被迫在 IIS 6 中运行我的项目。

在谷歌搜索后,我遇到了下面的代码。 不幸的是,此代码是错误的,并且此代码的结果具有错误的格式。


 public void CompressFile(string sDir, string sRelativePath, GZipStream zipStream)
    {
        //Compress file name
        char[] chars = sRelativePath.ToCharArray();
        zipStream.Write(BitConverter.GetBytes(chars.Length), 0, sizeof(int));
        foreach (char c in chars)
            zipStream.Write(BitConverter.GetBytes(c), 0, sizeof(char));

        //Compress file content
        byte[] bytes = File.ReadAllBytes(Path.Combine(sDir, sRelativePath));
        zipStream.Write(BitConverter.GetBytes(bytes.Length), 0, sizeof(int));
        zipStream.Write(bytes, 0, bytes.Length);
    }

public void CompressDirectory(string sInDir, string sOutFile)
    {
        string[] sFiles = Directory.GetFiles(sInDir, "*.*", SearchOption.AllDirectories);
        int iDirLen = sInDir[sInDir.Length - 1] == Path.DirectorySeparatorChar ? sInDir.Length : sInDir.Length + 1;

        using (FileStream outFile = new FileStream(sOutFile, FileMode.Create, FileAccess.Write, FileShare.None))
        using (GZipStream str = new GZipStream(outFile, CompressionMode.Compress))
        foreach (string sFilePath in sFiles)
        {
            string sRelativePath = sFilePath.Substring(iDirLen);
            CompressFile(sInDir, sRelativePath, str);
        }
    }

上述代码的结果是一个 zip 文件,其中包含格式未知的文件。

请回复我如何在 Asp.net 2 (IIS 6)中压缩(压缩)目录?

C# 压缩 IIS-6 ASP.NET-2.0

评论

0赞 Robert Harvey 12/31/2022
您发布的代码似乎很合理,因此您需要提供有关问题所在的更多信息。
0赞 12/31/2022
添加代码结果的图像
0赞 jdweng 12/31/2022
您的链接在 URN 中显示您有 GZIP,这不是普通的 ZIP。GZIP是HTTP请求/响应中使用的压缩。您的代码采用 ZIP,然后使用 GZIP 进行压缩。因此,首先您必须解压缩GZIP。请参阅 stackoverflow.com/questions/24138373/...
0赞 1/2/2023
stackoverflow.com/questions/24138373/... 的代码使用 --originalFileStream.CopyTo(compressionStream);-- 函数,该函数未在 IIS 6 的 asp.net 2 中运行

答:

0赞 Stephen Wrighton 2/22/2023 #1

这是在处理 .NET 2.0 应用程序,由于某种原因,您无法将 IIS 和相应的 .NET Framework 升级到较新的版本(出于安全原因,您确实应该这样做)。当然,以下内容也适用于 .NET 3、3.5 和 4。

对于 .NET 2.0,System.IO.Compression 命名空间仅支持 GZip (.gz) 文件,并且需要该应用程序才能解压缩。GZip 是 GNU 的标准部分,我相信 7Zip 提供了一个易于使用的 Windows 可访问工具来使用它们。

也就是说,有一些 .Net 库可以帮助您创建实际的 ZIP 文件;例如,Dino 的 DotNetZip (https://github.com/DinoChiesa/DotNetZip)。对于像 .NET 2 甚至 3.5 这样古老的框架来说,它们可能有点难找到。

DotNetZip 确实需要 .NET 3.5 才能生成,但一旦生成 DLL,文档就会指出 DLL 可以在 .NET 2.0 应用程序中集成和使用。使用它相当简单:

using (ZipFile zip = new ZipFile())
 {
     // add this map file into the "images" directory in the zip archive
     zip.AddFile("c:\\images\\personal\\7440-N49th.png", "images");
     // add the report into a different directory in the archive
     zip.AddFile("c:\\Reports\\2008-Regional-Sales-Report.pdf", "files");
     // add the Readme to the root directory in the archive 
     zip.AddFile("ReadMe.txt");
     zip.Save("MyZipFile.zip");
 }

正如我所提到的,其他库确实存在,但我知道这个库运行良好,因为我过去使用过它。

现在,如果您使用的是更现代的 .NET 版本(基本上是 4.5 或更高版本),则可以在 System.IO.Compression 命名空间中使用 ZipFile 类型。这非常易于使用:

using System;
using System.IO.Compression;

class MyClass
{
    public void CompressDirectory(string sInDir, string sOutFile)
    {
        ZipFile.CreateFromDirectory(sInDir, sOutFile);

    }
}