如何将文件附加到 dotnet zip 库 c#

How to attach files to dotnet zip library c#

我正在使用 dotnet zip 库创建 zip 文件。我的文件保存到数据库中,我正在读取每一行并将文件数据从数据库加载到内存中,并将内存流保存到 zip 文件中。我的以下代码工作正常。

using System.IO;
using Ionic.Zip;

private void button2_Click(object sender, EventArgs e)
        {
            using (SqlConnection sqlConn = new SqlConnection(@"Data Source=BBATRIDIP\SQLSERVER2008R2;Initial Catalog=test;Integrated Security=True"))
            {
                string query = String.Format(@"SELECT Name, ContentType, Data FROM [TestTable]");
                SqlCommand cmd = new SqlCommand(query, sqlConn);
                cmd.Connection.Open();

                System.IO.MemoryStream memStream = null;
                ZipFile zip = new ZipFile();
                zip.MaxOutputSegmentSize = 1024 * 1024; // 1MB each segment size would be
                // the above line would split zip file into multiple files and each file
                //size would be 1MB
                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        byte[] data = (byte[])reader["Data"];
                        memStream = new System.IO.MemoryStream(data);
                        string strFile = reader["Name"].ToString() + "\" + reader["ContentType"].ToString();
                        ZipEntry ze = zip.AddEntry(strFile, memStream);
                        int xx = 0;
                    }
                }
                zip.Save(@"e:\MyCustomZip.zip");

                memStream.Dispose();
                MessageBox.Show("Job Done");
                // here u can save the zip in memory stream also there is a overload insteaa of saving in HD
            }
        }

但如果我对代码稍作更改,则会创建损坏的 zip 文件。如果我更改此行 zip.Save(@"e:\MyCustomZip.zip"); 则会出现问题。

    using (SqlConnection sqlConn = new SqlConnection(@"Data Source=BBATRIDIP\SQLSERVER2008R2;Initial Catalog=test;Integrated Security=True"))
    {
        string query = String.Format(@"SELECT Name, ContentType, Data FROM [TestTable]");
        SqlCommand cmd = new SqlCommand(query, sqlConn);
        cmd.Connection.Open();

        System.IO.MemoryStream memStream = null;
        ZipFile zip = new ZipFile();
        zip.MaxOutputSegmentSize = 1024 * 1024; // 1MB each segment size would be
        // the above line would split zip file into multiple files and each file
        //size would be 1MB
        zip.Save(@"e:\MyCustomZip.zip");
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                byte[] data = (byte[])reader["Data"];
                memStream = new System.IO.MemoryStream(data);
                string strFile = reader["Name"].ToString() + "\" + reader["ContentType"].ToString();
                ZipEntry ze = zip.AddEntry(strFile, memStream);
                int xx = 0;
            }
        }


        memStream.Dispose();
        MessageBox.Show("Job Done");
        // here u can save the zip in memory stream also there is a overload insteaa of saving in HD
    }

我最初想创建零 kb 的 zip,当我将流添加到循环中的 zip 时,zip 文件的大小将逐渐增加。如果您看到我上面的代码,我尝试这样做但没有成功。我在代码中做错了什么?

另一个问题

dotnet zip 压缩比不好。我用 dotnet zip 压缩了一个 152 KB 的文档文件,当创建 zip 时,我的 zip 文件大小是 136KB。是否存在创建小尺寸 zip 文件的任何调整。分享知识。谢谢

因此,查看 documentation for ZipFile.Save,我们看到以下内容:

Use this when creating a new zip file, or when updating a zip archive.

因此,您似乎需要反复调用它才能获得您正在寻找的 "update" 行为。因此只需要将你的 Save 移动到循环中:

//...
ZipFile zip = new ZipFile();
zip.MaxOutputSegmentSize = 1024 * 1024; 

using (SqlDataReader reader = cmd.ExecuteReader())
{
    while (reader.Read())
    {
        byte[] data = (byte[])reader["Data"];
        memStream = new System.IO.MemoryStream(data);
        string strFile = 
            reader["Name"].ToString() + "\" + reader["ContentType"].ToString();
        ZipEntry ze = zip.AddEntry(strFile, memStream);
        zip.Save(@"e:\MyCustomZip.zip");
    }
}

关于你的第二个问题(关于 SO 从来都不是一个好主意,尝试每个问题坚持一个问题):

在不知道您正在压缩什么的情况下,很难推测您可能会达到什么样的压缩率。如果数据已经被压缩(例如压缩 image/video 如 jpeg/h264),压缩不会给你任何好处。关于内容性质的唯一提示是它是 "doc"。如果您谈论的是现代 Word 文档 (docx),这已经是一个 zip 压缩文件夹结构。收益将微乎其微。如果它是另一种文档,也许它包含嵌入式(压缩)媒体?这样也会相对不可压缩。