c# Sharpziplib 将文件添加到现有存档中

问题描述 投票:0回答:8

我尝试使用以下代码将文件添加到现有存档中。运行时不会显示错误或异常,但也不会将文件添加到存档中。有什么想法吗?

        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();
            }
        }
c# append archive addition sharpziplib
8个回答
15
投票

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() 或任何其他问题。



1
投票
Codeproject 有人使用了这段代码。唯一的区别是接近并以其他方式完成和写入部分:

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的阅读...


0
投票
/// <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(); }
    

0
投票
站点根目录中有一个文件夹

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


0
投票

ZipOutputStream

类不会更新现有的ZIP文件。请改用 
ZipFile
 类。


0
投票
首先,使用

ZipFile

 类,因为 
ZipOutputStream
 类不会更新现有的 ZIP 文件。

其次,使用以文件路径作为参数的

ZipFile

构造函数。这将生成一个允许您操作现有文件的实例(不要使用 
ZipFile.Create()
 工厂方法,因为它总是会覆盖任何现有的 ZIP 文件)。

下面的代码可以做到这一点:

using var zipFile = new ZipFile(zipFilePath); zipFile.BeginUpdate(); zipFile.Add(sourceFilePath, Path.GetFileName(sourceFilePath)); zipFile.CommitUpdate();
    

-1
投票
我找到了一个简单的解决方案,仅将其保留为 ZipFile 和 ZipEntry

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();
    
© www.soinside.com 2019 - 2024. All rights reserved.