提问人: 提问时间:12/31/2022 更新时间:2/22/2023 访问量:152
如何在IIS 6中运行的 Asp.net 2.0中的Zip /Compress目录(文件夹)?
How Zip/Compress directory(folder) in Asp.net 2.0 that runs in IIS 6?
问:
我想将包含多个文件的目录(文件夹)压缩为在 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)中压缩(压缩)目录?
答:
这是在处理 .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);
}
}
评论