我尝试使用以下代码将文件添加到现有存档中。运行时不会显示错误或异常,但也不会将文件添加到存档中。有什么想法吗?
using (FileStream fileStream = File.Open(archivePath, FileMode.Open, FileAccess.ReadWrite))
using (ZipOutputStream zipToWrite = new ZipOutputStream(fileStream))
{
zipToWrite.SetLevel(9);
using (FileStream newFileStream = File.OpenRead(sourceFiles[0]))
{
byte[] byteBuffer = new byte[newFileStream.Length - 1];
newFileStream.Read(byteBuffer, 0, byteBuffer.Length);
ZipEntry entry = new ZipEntry(sourceFiles[0]);
zipToWrite.PutNextEntry(entry);
zipToWrite.Write(byteBuffer, 0, byteBuffer.Length);
zipToWrite.CloseEntry();
zipToWrite.Close();
zipToWrite.Finish();
}
}
在 DotNetZip 中,将文件添加到现有 zip 中非常简单且可靠。
using (var zip = ZipFile.Read(nameOfExistingZip))
{
zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
zip.AddFile(additionalFileToAdd);
zip.Save();
}
如果您想为该新文件指定目录路径,请对 AddFile() 使用不同的重载。
using (var zip = ZipFile.Read(nameOfExistingZip))
{
zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
zip.AddFile(additionalFileToAdd, "directory\\For\\The\\Added\\File");
zip.Save();
}
如果要添加一组文件,请使用 AddFiles()。
using (var zip = ZipFile.Read(nameOfExistingZip))
{
zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
zip.AddFiles(listOfFilesToAdd, "directory\\For\\The\\Added\\Files");
zip.Save();
}
您不必担心 Close()、CloseEntry()、CommitUpdate()、Finish() 或任何其他问题。
我认为您的
Finish
通话应该在 Close
之前进行。
更新:这看起来像是一个已知的错误。它可能已经被修复 - 您需要检查您的 SharpZipLib 版本以查看它是否包含任何修复。如果没有,您可以通过将所有文件复制到新存档,添加新文件,然后将新存档移动到旧存档名称来解决此问题。
using (ZipOutputStream s = new
ZipOutputStream(File.Create(txtSaveTo.Text + "\\" +
sZipFileName + ".zip")))
{
s.SetLevel(9); // 0-9, 9 being the highest compression
byte[] buffer = new byte[4096];
foreach (string file in filenames)
{
ZipEntry entry = new
ZipEntry(Path.GetFileName(file));
entry.DateTime = DateTime.Now;
s.PutNextEntry(entry);
using (FileStream fs = File.OpenRead(file))
{
int sourceBytes;
do
{
sourceBytes = fs.Read(buffer, 0,
buffer.Length);
s.Write(buffer, 0, sourceBytes);
} while (sourceBytes > 0);
}
}
s.Finish();
s.Close();
}
顺便说一句:
byte[] byteBuffer = new byte[newFileStream.Length - 1];
newFileStream.Read(byteBuffer, 0, byteBuffer.Length);
这是不正确的,大小是newFileStream.length,否则读取会出错。 你有一个数组,例如 10-1 是 9 个字节长,从 0 到 8。
但是你从0到9的阅读...
/// <summary>
/// 添加压缩文件 p 为客户端传回来的文件/夹列表,用分号隔开,不包括主路径, zipfile压缩包的名称
/// </summary>
/// <param name="p"></param>
/// <param name="zipfile"></param>
public void AddZipFile(string p, string zipfile)
{
if (ServerDir.LastIndexOf(@"\") != ServerDir.Length - 1)
{
ServerDir += @"\";
}
string[] tmp = p.Split(new char[] { ';' }); //分离文件列表
if (zipfile != "") //压缩包名称不为空
{
string zipfilepath=ServerDir + zipfile;
if (_ZipOutputStream == null)
{
_ZipOutputStream = new ZipOutputStream(File.Create(zipfilepath));
}
for (int i = 0; i < tmp.Length; i++)
{
if (tmp[i] != "") //分离出来的文件名不为空
{
this.AddZipEntry(tmp[i], _ZipOutputStream, out _ZipOutputStream); //向压缩文件流加入内容
}
}
}
}
private static ZipOutputStream _ZipOutputStream;
public void Close()
{
_ZipOutputStream.Finish();
_ZipOutputStream.Close();
}
ZippedFolder,里面有一个存档MyZipFiles。
有一个名为siteImages 的文件夹,其中包含所有图像文件。 以下是压缩图像的代码
string zipPath = Server.MapPath("~/ZippedFolder/MyZipFiles.zip");
using (ZipFile zip = new ZipFile())
{
zip.AddFile(Server.MapPath("~/siteImages/img1.jpg"),string.Empty);
zip.AddFile(Server.MapPath("~/siteImages/img2.jpg"),string.Empty);
zip.AddFile(Server.MapPath("~/siteImages/img2.jpg"),string.Empty);
zip.Save(zipPath);
}
如果我们有不同的文件格式,并且我们希望您的文件保存在各自的文件夹中,您可以指定如下代码。
string zipPath = Server.MapPath("~/ZippedFolder/MyZipFiles.zip");
using (ZipFile zip = new ZipFile())
{
zip.AddFile(Server.MapPath("~/siteimages/img1.jpg"), "images");
zip.AddFile(Server.MapPath("~/siteimages/img2.jpg"), "images");
zip.AddFile(Server.MapPath("~/documents/customer.pdf"), "files");
zip.AddFile(Server.MapPath("~/documents/sample.doc"), "files");
zip.Save(zipPath);
}
现在存档包含两个文件夹
图像 ---- > img1.jpg , img2,.jpg 和另一个文件夹 文件 --> customer.pdf、sample.doc
ZipOutputStream
类不会更新现有的ZIP文件。请改用
ZipFile
类。
ZipFile
类,因为
ZipOutputStream
类不会更新现有的 ZIP 文件。其次,使用以文件路径作为参数的
ZipFile
构造函数。这将生成一个允许您操作现有文件的实例(不要使用
ZipFile.Create()
工厂方法,因为它总是会覆盖任何现有的 ZIP 文件)。下面的代码可以做到这一点:
using var zipFile = new ZipFile(zipFilePath);
zipFile.BeginUpdate();
zipFile.Add(sourceFilePath, Path.GetFileName(sourceFilePath));
zipFile.CommitUpdate();
ZipFile zipExisting = ZipFile.Read(Server.MapPath("/_Layouts/includes/Template.zip"));
ICollection<ZipEntry> entries = _zipFileNew.Entries;
foreach (ZipEntry zipfile in entries)
{
zipExisting.AddEntry(zipfile.FileName, zipfile.InputStream);
}
zipExisting.Save(Response.OutputStream);
Response.End();