我不知道为什么这不起作用 - 开始让我发疯!
似乎没有其他人有这个问题
我的代码看起来像这样:
Stream stream = new MemoryStream();
try
{
// output zip
using (ZipFile zipFile = new ZipFile())
{
zipFile.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
ForEach(DataFile file In DataFiles)
{
String sourcePath = dataFile.Path;
String archiveName = dataFile.RealName;
//byte[] fileContents = File.ReadAllBytes(sourcePath);
//zipFile.AddEntry(archiveName, fileContents);
zipFile.AddFile(sourcePath, archiveName);
//e.FileName = archiveName;
}
zipFile.AddEntry("README.TXT", readmeMessage);
zipFile.Save(stream);
}
}
catch (Exception ex)
{
throw;
}
所有文件路径都有效。
添加自述文件工作正常,如果我注释掉其余部分。 但添加其他文件会导致zip文件无效。
我会很感激任何建议!
由于
更新
我注意到如果我使用恰当的大小初始化流,它就能工作。 有没有人知道如何在不将其写入磁盘的情况下获取存档的大小?
进一步更新
我现在已经添加了一种解决方法。
我可以通过将存档保存到磁盘然后将其重新读回另一个流来完成我需要的工作
非常蹩脚,我真的不喜欢它,所以如果有人能提出更好的方式我会感激不尽!
答案 0 :(得分:1)
我从未使用它,但查看DotNetZip Library {{3}}的示例(一些检查,评论和删除相关行)我发现了这个:
public static void Main(String[] args)
{
... some input checking ...
string ZipFileToCreate = args[0];
string DirectoryToZip = args[1];
try
{
using (ZipFile zip = new ZipFile())
{
// note: this does not recurse directories!
String[] filenames = System.IO.Directory.GetFiles(DirectoryToZip);
foreach (String filename in filenames)
{
Console.WriteLine("Adding {0}...", filename);
ZipEntry e = zip.AddFile(filename);
e.Comment = "Added by Cheeso's CreateZip utility.";
}
zip.Save(ZipFileToCreate);
}
}
catch (System.Exception ex1)
{
System.Console.Error.WriteLine("exception: " + ex1);
}
}
答案 1 :(得分:0)
似乎一旦zip存档达到一定的大小(我还没有经过足够的测试以确定实际限制),它就无法可靠地保存到流中。
虽然似乎没有人这样说,但唯一的办法是将存档保存到磁盘。