Mar*_*cze 45 .net c# ziparchive windows-8
我试图从一个条目的代码创建一个新的ZIP包,并将ZIP包保存到文件.我试图用System.IO.Compression.ZipArchive类来实现这一点.我正在使用以下代码创建ZIP包:
using (MemoryStream zipStream = new MemoryStream())
{
using (ZipArchive zip = new ZipArchive(zipStream, ZipArchiveMode.Create))
{
var entry = zip.CreateEntry("test.txt");
using (StreamWriter sw = new StreamWriter(entry.Open()))
{
sw.WriteLine(
"Etiam eros nunc, hendrerit nec malesuada vitae, pretium at ligula.");
}
Run Code Online (Sandbox Code Playgroud)
然后我将ZIP保存到WinRT中的文件:
var file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync("test.zip", CreationCollisionOption.ReplaceExisting);
zipStream.Position = 0;
using (Stream s = await file.OpenStreamForWriteAsync())
{
zipStream.CopyTo(s);
}
Run Code Online (Sandbox Code Playgroud)
或者在普通的.NET 4.5中:
using (FileStream fs = new FileStream(@"C:\Temp\test.zip", FileMode.Create))
{
zipStream.Position = 0;
zipStream.CopyTo(fs);
}
Run Code Online (Sandbox Code Playgroud)
但是,我无法在Windows资源管理器,WinRAR等中打开生成的文件.(我检查生成的文件的大小是否与zipStream的长度匹配,因此流本身已正确保存到文件中.)
我是做错了什么或者ZipArchive类有问题吗?
Mar*_*cze 86
我在代码中找到了 - 回顾性,明显 - 错误.必须处理 ZipArchive 以使其将内容写入其基础流.所以我必须在ZipArchive的using块结束后将流保存到文件中.
并且将其构造函数的leaveOpen参数设置为true 非常重要,以使其不关闭底层流.所以这是完整的工作解决方案:
using (MemoryStream zipStream = new MemoryStream())
{
using (ZipArchive zip = new ZipArchive(zipStream, ZipArchiveMode.Create, true))
{
var entry = zip.CreateEntry("test.txt");
using (StreamWriter sw = new StreamWriter(entry.Open()))
{
sw.WriteLine(
"Etiam eros nunc, hendrerit nec malesuada vitae, pretium at ligula.");
}
}
var file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(
"test.zip",
CreationCollisionOption.ReplaceExisting);
zipStream.Position = 0;
using (Stream s = await file.OpenStreamForWriteAsync())
{
zipStream.CopyTo(s);
}
}
Run Code Online (Sandbox Code Playgroud)
// Create file "archive.zip" in current directory use it as destination for ZIP archive
using (var zipArchive = new ZipArchive(File.OpenWrite("archive.zip"),
ZipArchiveMode.Create))
{
// Create entry inside ZIP archive with name "test.txt"
using (var entry = zipArchive.CreateEntry("test.txt").Open())
{
// Copy content from current directory file "test.txt" into created ZIP entry
using (var file = File.OpenRead("test.txt"))
{
file.CopyTo(entry);
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果,您将获得包含单个条目文件“test.txt”的存档“archive.zip”。您需要这种级联using以避免与已处置的资源进行任何交互。
| 归档时间: |
|
| 查看次数: |
39424 次 |
| 最近记录: |