简体   繁体   English

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

[英]c# sharpziplib adding file to existing archive

am trying to add a file to an existing archive using the following code. 我正在尝试使用以下代码将文件添加到现有存档。 When run no errors or exceptions are shown but no files are added to the archive either. 运行时不会显示任何错误或异常,但也不会将任何文件添加到存档中。 Any ideas why? 有什么想法吗?

        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();
            }
        }

In DotNetZip , adding files to an existing zip is really simple and reliable. DotNetZip中 ,将文件添加到现有zip非常简单可靠。

using (var zip = ZipFile.Read(nameOfExistingZip))
{
    zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
    zip.AddFile(additionalFileToAdd);
    zip.Save();
}

If you want to specify a directory path for that new file, then use a different overload for AddFile(). 如果要为该新文件指定目录路径,请对AddFile()使用不同的重载。

using (var zip = ZipFile.Read(nameOfExistingZip))
{
    zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
    zip.AddFile(additionalFileToAdd, "directory\\For\\The\\Added\\File");
    zip.Save();
}

If you want to add a set of files, use AddFiles(). 如果要添加一组文件,请使用AddFiles()。

using (var zip = ZipFile.Read(nameOfExistingZip))
{
    zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
    zip.AddFiles(listOfFilesToAdd, "directory\\For\\The\\Added\\Files");
    zip.Save();
}

You don't have to worry about Close(), CloseEntry(), CommitUpdate(), Finish() or any of that other gunk. 您不必担心Close(),CloseEntry(),CommitUpdate(),Finish()或任何其他gunk。

From Codeproject someone used this code. 从Codeproject有人使用此代码。 Only difference is close and finish otherway around and the write part: 只差异很接近并完成其他方面和写入部分:

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();
}

BTW: BTW:

byte[] byteBuffer = new byte[newFileStream.Length - 1];

                newFileStream.Read(byteBuffer, 0, byteBuffer.Length);

This is incorrect, the size is newFileStream.length else the Read goes wrong. 这是不正确的,大小是newFileStream.length否则Read出错了。 You have an array and you make it for example 10-1 is 9 bytes long, from 0 to 8. 你有一个数组,你做它例如10-1是9字节长,从0到8。

But your reading from 0 to 9... 但你的读数从0到9 ......

I think your Finish call should be before your Close call. 我认为你的Finish电话应该你的Close通话之前

Update: This looks like a known bug . 更新:这看起来像一个已知的错误 It's possible it may already have been fixed - you'll need to check your SharpZipLib version to see if it incorporates any fix. 它可能已经修复 - 你需要检查你的SharpZipLib版本,看它是否包含任何修复。 If not, you can work around it by copying all files to a new archive, adding the new file, then moving the new archive to the old archive name. 如果没有,您可以通过将所有文件复制到新存档,添加新文件,然后将新存档移动到旧存档名称来解决此问题。

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

there is a folder ZippedFolder in site's root directory , inside it we have a archive MyZipFiles . 有一个文件夹ZippedFolder在网站的根目录,里面我们有一个存档MyZipFiles。

There is a folder with name siteImages which consists of all image files. 有一个名为siteImages的文件夹,其中包含所有图像文件。 The following is the code to zip the images 以下是压缩图像的代码

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);
}

if we have different file formats and we want your files to be saved in respective folders,you can specify the code as follows. 如果我们有不同的文件格式,并且我们希望您的文件保存在相应的文件夹中,则可以按如下方式指定代码。

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);
}

now the archive contains two folders images ---- > img1.jpg , img2,.jpg and another folder files --> customer.pdf, sample.doc 现在存档包含两个文件夹图像 ----> img1.jpg,img2,.jpg和另一个文件夹文件 - > customer.pdf,sample.doc

The ZipOutputStream class does not update existing ZIP files. ZipOutputStream类不更新现有的ZIP文件。 Use the ZipFile class instead. 请改用ZipFile类。

I have found a simple solution keeping it to ZipFile and ZipEntry only 我找到了一个简单的解决方案,只保留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();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM