如何将文件附加到 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 压缩文件夹结构。收益将微乎其微。如果它是另一种文档,也许它包含嵌入式(压缩)媒体?这样也会相对不可压缩。
我正在使用 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 压缩文件夹结构。收益将微乎其微。如果它是另一种文档,也许它包含嵌入式(压缩)媒体?这样也会相对不可压缩。