我有一个DataTable,我想将它转换为xml,然后使用DotNetZip压缩它.最后用户可以通过Asp.Net网页下载.我的代码在下面
dt.TableName = "Declaration";
MemoryStream stream = new MemoryStream();
dt.WriteXml(stream);
ZipFile zipFile = new ZipFile();
zipFile.AddEntry("Report.xml", "", stream);
Response.ClearContent();
Response.ClearHeaders();
Response.AppendHeader("content-disposition", "attachment; filename=Report.zip");
zipFile.Save(Response.OutputStream);
//Response.Write(zipstream);
zipFile.Dispose();
Run Code Online (Sandbox Code Playgroud)
zip文件中的xml文件为空.
using (ZipFile zip = new ZipFile())
{
foreach(string file in Directory.GetFiles(folder))
{
zip.AddFile(file, Path.GetFileName(file));
}
zip.Save("test.zip"));
}
Run Code Online (Sandbox Code Playgroud)
每次添加文件时,都会为它创建一个新的子文件夹.
所以我想最终得到:
test.zip
- myDoc.doc
- myPdf.pdf
Run Code Online (Sandbox Code Playgroud)
但我最终得到:
test.zip
- myDoc.doc
- myDoc.doc
- myPdf.pdf
- myPdf.pdf
Run Code Online (Sandbox Code Playgroud) 我正在使用以下代码创建拆分归档:
string filename = "FileName.pdf";
using (ZipFile zip = new ZipFile())
{
zip.UseZip64WhenSaving = Zip64Option.Default;
zip.CompressionLevel = Ionic.Zlib.CompressionLevel.Default;
using (FileStream stream = new FileStream(temp, FileMode.Open))
{
zip.AddEntry(filename, stream);
zip.MaxOutputSegmentSize = settings.AttachmentSize * (1024 * 1024);
zip.Save(zipFileName);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码生成3个文件:file.zip, file.z01 and file.z02.当我右键单击该zip文件并选择Extract All(不使用WinRAR或其他压缩软件提取,只是内置的Windows zip)时,它会给我以下错误:
相同的卷不能同时用作源和目标

奇怪的是,它只发生在我第一次尝试提取文件时,后续的提取是正常的,所以它必须是文件首先被压缩的方式.
更新1
即使我提取到不同的文件夹,也会发生同样的事情
在DotNetZip Codeplex网站上已就此问题进行了讨论,但似乎问题尚未得到解决
http://dotnetzip.codeplex.com/discussions/239172
http://dotnetzip.codeplex.com/discussions/371005
更新2
查看MaxOutputSegmentSize属性的doc ,引用它:
我不相信Windows资源管理器可以提取拆分存档.
关于为什么,没有进一步的解释.我认为这是假阳性,因为如上所述,
它只在我第一次尝试提取文件时发生,后续提取都可以
我正在使用Windows 8.1 64位.
我有一个函数获取ZIP文件并将其解压缩到一个目录(我使用DotNetZip库.)
public void ExtractFileToDirectory(string zipFileName, string outputDirectory)
{
ZipFile zip = ZipFile.Read(zipFileName);
Directory.CreateDirectory(outputDirectory);
zip.ExtractAll(outputDirectory,ExtractExistingFileAction.OverwriteSilently);
}
Run Code Online (Sandbox Code Playgroud)
我的ZIP文件包含多个文件和目录.但我想只提取其中一些文件,而不是全部.
我怎样才能做到这一点?
我正在使用DotNetZip创建一个zip文件并将其传递给FileResult.在调试时,我可以验证MemoryStream是否包含文件,但是当我通过FileStreamResult运行它时,它返回0bytes:
public FileResult GetZipFiles(int documentId) {
var file = fileRepository.Get(documentId);
var zip = new ZipFile();
var stream = new MemoryStream();
var filePath = Path.Combine(UploadsFolder, Path.GetFileName(file.Id));
zip.AddFile(filePath);
zip.Save(stream);
var result = new FileStreamResult(stream, "application/zip")
{ FileDownloadName = "hey.zip" };
return result;
}
Run Code Online (Sandbox Code Playgroud)
同样,我可以验证流不是空的,但这将始终将文件返回hey.zip为0bytes.我一定在MemoryStream这里用错了?或者FileStreamResult做一些我不希望它做的事情?我以前用过FileStreamResult,但没用过MemoryStream.
我有一个奇怪的文件,当用DotNetZip压缩时创建一个'ununzipable'存档.当我尝试用7zip解压缩时,它会失败,CRC failed in 'AjaxControlToolkit.dll'. File is broken.当我用7zip手动拉链时,它会解压缩.
有没有人遇到DotNetZip无法正确压缩简单二进制文件的情况?或者我错误地使用DotNetZip?
https://dl.dropbox.com/u/65419748/AjaxControlToolkit.dll
using System.IO;
using Ionic.Zip;
namespace ConsoleApplication1
{
public class Program
{
public static void Main(string[] args)
{
var source = new FileInfo(@"C:\ZipDemo\AjaxControlToolkit.dll");
var target = new FileInfo(Path.ChangeExtension(source.FullName, "zip"));
var folder = new DirectoryInfo(Path.ChangeExtension(source.FullName, null));
if (target.Exists)
target.Delete();
if (folder.Exists)
folder.Delete(true);
using (var zip = new ZipFile(target.FullName))
{
zip.AddFile(source.FullName, string.Empty);
zip.Save();
}
using (var zip = new ZipFile(target.FullName))
zip.ExtractAll(folder.FullName);
}
}
}
Run Code Online (Sandbox Code Playgroud)
抛出:
Unhandled Exception: Ionic.Zip.BadReadException: bad read of entry …Run Code Online (Sandbox Code Playgroud) 使用DotNetZip,是否可以压缩文件,使得zip列出文件的文件名不同于磁盘上的文件名?例如,我想将myFile.txt添加到zip文件中,但我希望将其命名为otherFile.txt.
我正在使用DotNetZip来压缩我的文件,但我需要在zip中设置密码.
我试过:
public void Zip(string path, string outputPath)
{
using (ZipFile zip = new ZipFile())
{
zip.AddDirectory(path);
zip.Password = "password";
zip.Save(outputPath);
}
}
Run Code Online (Sandbox Code Playgroud)
但输出zip没有密码.
该参数path有一个例子的子文件夹:
path = c:\path\
我有内部路径subfolder
怎么了?
我有一个WCF Web服务,可以将文件保存到一个文件夹(大约200,000个小文件).之后,我需要将它们移动到另一台服务器.
我发现的解决方案是拉链然后移动它们.
当我采用这个解决方案时,我已经用(20,000个文件)进行了测试,压缩20,000个文件只需要大约2分钟,并且移动zip非常快.但在生产中,压缩200,000个文件需要2个多小时.
这是我压缩文件夹的代码:
using (ZipFile zipFile = new ZipFile())
{
zipFile.UseZip64WhenSaving = Zip64Option.Always;
zipFile.CompressionLevel = CompressionLevel.None;
zipFile.AddDirectory(this.SourceDirectory.FullName, string.Empty);
zipFile.Save(DestinationCurrentFileInfo.FullName);
}
Run Code Online (Sandbox Code Playgroud)
我想修改WCF Web服务,以便保存到zip文件而不是保存到文件夹.
我使用以下代码进行测试:
var listAes = Directory.EnumerateFiles(myFolder, "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".aes")).Select(f => new FileInfo(f));
foreach (var additionFile in listAes)
{
using (var zip = ZipFile.Read(nameOfExistingZip))
{
zip.CompressionLevel = Ionic.Zlib.CompressionLevel.None;
zip.AddFile(additionFile.FullName);
zip.Save();
}
file.WriteLine("Delay for adding a file : " + sw.Elapsed.TotalMilliseconds);
sw.Restart();
}
Run Code Online (Sandbox Code Playgroud)
添加到zip的第一个文件只需5毫秒,但要添加的第10,000个文件需要800毫秒.
有没有办法优化这个?或者,如果您有其他建议?
编辑
上面显示的示例仅用于测试,在WCF Web服务中,我将有不同的请求发送我需要添加到Zip文件的文件.由于WCF是无规则的,每次调用我都会有一个新类的实例,那么如何保持Zip文件打开以添加更多文件?
我正在尝试使用DotNetZip和powershell压缩日志.这些文件位于C:\ user\temp\logs当我遍历目录中的日志并将它们添加到zip文件时,当我只想要日志文件时,我最终得到了文件夹层次结构和日志文件.
因此拉链最终包含:
-user
?temp
?logs
?log1.log
log2.log
log3.log
Run Code Online (Sandbox Code Playgroud)
当我想要包含的zip文件是:
log1.log
log2.log
log3.log
Run Code Online (Sandbox Code Playgroud)
这是我正在运行以测试的脚本:
[System.Reflection.Assembly]::LoadFrom("c:\\\User\\bin\\Ionic.Zip.dll");
$zipfile = new-object Ionic.Zip.ZipFile("C:\user\temp\logs\TestZIP.zip");
$directory = "C:\user\temp\logs\"
$children = get-childitem -path $directory
foreach ($o in $children)
{
if($o.Name.EndsWith(".log")){
$e = $zipfile.AddFile($o.FullName)
}
}
$zipfile.Save()
$zipfile.Dispose()
Run Code Online (Sandbox Code Playgroud) dotnetzip ×10
c# ×9
zip ×4
.net-4.0 ×1
asp.net ×1
asp.net-mvc ×1
directory ×1
extract ×1
performance ×1
powershell ×1
stream ×1
wcf ×1