标签: dotnetzip

从流创建Zip文件并下载它

我有一个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文件为空.

c# asp.net zip stream dotnetzip

45
推荐指数
2
解决办法
8万
查看次数

DotNetZip添加文件而不创建文件夹

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)

c# directory zip dotnetzip

34
推荐指数
1
解决办法
3万
查看次数

相同的卷不能同时用作源和目标

我正在使用以下代码创建拆分归档:

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位.

c# dotnetzip

33
推荐指数
1
解决办法
8261
查看次数

通过DotNetZip库以编程方式提取ZIP文件?

我有一个函数获取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文件包含多个文件和目录.但我想只提取其中一些文件,而不是全部.

我怎样才能做到这一点?

c# zip extract dotnetzip

32
推荐指数
3
解决办法
4万
查看次数

可以使用MemoryStream和FileStreamResult吗?

我正在使用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.

c# asp.net-mvc dotnetzip

21
推荐指数
1
解决办法
2万
查看次数

.Extract上的DotNetZip BadReadException

我有一个奇怪的文件,当用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)

c# dotnetzip

21
推荐指数
1
解决办法
1万
查看次数

DotNetZip - 压缩时重命名zip文件中的文件条目

使用DotNetZip,是否可以压缩文件,使得zip列出文件的文件名不同于磁盘上的文件名?例如,我想将myFile.txt添加到zip文件中,但我希望将其命名为otherFile.txt.

c# .net-4.0 dotnetzip

19
推荐指数
1
解决办法
1万
查看次数

使用DotNetZip在Zip文件上设置密码

我正在使用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

怎么了?

c# zip password-protection dotnetzip

18
推荐指数
1
解决办法
1万
查看次数

将文件添加到现有Zip中 - 性能问题

我有一个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文件打开以添加更多文件?

c# performance wcf dotnetzip

17
推荐指数
2
解决办法
3625
查看次数

如何在PowerShell中使用DotNetZip仅压缩文件而不压缩完整路径层次结构?

我正在尝试使用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)

powershell dotnetzip

16
推荐指数
1
解决办法
1万
查看次数