从压缩率为 "ZERO" 的 "Zip" 文件中读取文件文本
reading file text from a "Zip" file with "ZERO" compression ratio
我有下面的代码,create
一个新的 zip 文件,然后 add entry
到这个文件 NoCompression
即 ZERO compression ratio
然后尝试阅读这个条目作为普通文本。
using System;
using System.IO;
using System.IO.Compression;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
using (FileStream zipToOpen = new FileStream(@"d:\release.zip", FileMode.Create))
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))
{
ZipArchiveEntry readmeEntry = archive.CreateEntry("Readme.txt", CompressionLevel.NoCompression);
using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
{
writer.WriteLine("Information about this package.");
writer.WriteLine("========================");
}
}
}
string text = System.IO.File.ReadAllText(@"d:\release.zip\Readme.txt");
Console.WriteLine("Contents of WriteText.txt = {0}", text);
}
}
}
zip 文件及其条目均已创建,我可以从 windows 资源管理器访问它们,但是一旦代码尝试读取它,就会出现以下错误:
Unhandled Exception: System.IO.DirectoryNotFoundException: Could not
find a part of the path 'd:\release.zip\Readme.txt'. at
System.IO.Win32FileStream..ctor(String path, FileMode mode, FileAccess
access, FileShare share, Int32 bufferSize, FileOptions opti ons,
FileStream parent) at System.IO.Win32FileSystem.Open(String
fullPath, FileMode mode, FileAccess access, FileShare share, Int32
bufferSize, FileOptions o ptions, FileStream parent) at
System.IO.FileStream.Init(String path, FileMode mode, FileAccess
access, FileShare share, Int32 bufferSize, FileOptions options) at
System.IO.File.InternalReadAllText(String path, Encoding encoding)
at System.IO.File.ReadAllText(String path) at
ConsoleApplication.Program.Main(String[] args)
首先需要注意的是,您并没有创建一个zip文件,您创建的是一个特定压缩率的归档文件;在您的情况下,您创建了一个未压缩的 ZIP 存档。
and I can access them from the windows explorer
我不能,因为我有 7zip 与 .zip
文件关联,所以 7z 打开存档;在你的情况下 Windows Explorer 正在为你做这件事。因此,当您浏览到 .zip
文件并打开它时,资源管理器会将存档文件视为一个文件夹并向您显示存档的内容。
但是,当您这样做时:
string text = System.IO.File.ReadAllText(@"d:\release.zip\Readme.txt");
System.IO.File.ReadAllText
将打开您作为参数传递的特定文件,在您的情况下为 d:\release.zip\Readme.txt
。因此试图打开的路径是:驱动器 D:
、文件夹 release.zip
、文件 Readme.txt
... 因为 d:\release.zip
是一个 文件 而不是 文件夹 ,找不到路径,这就是为什么您会收到 DirectoryNotFoundException
异常。
为此,如果您想阅读该条目,只需按照您对 Create
存档所做的操作即可,除了来自 Open
的存档的 Read
和 .GetEntry
而不是 .CreateEntry
,例如:
string text = string.Empty;
using (FileStream zipToOpen = new FileStream(@"c:\test\release.zip", FileMode.Open)) {
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Read)) {
ZipArchiveEntry readmeEntry = archive.GetEntry("Readme.txt");
using (StreamReader reader = new StreamReader(readmeEntry.Open())) {
text = reader.ReadToEnd();
}
}
}
Console.WriteLine("Contents of WriteText.txt = {0}", text);
希望能帮到你。
我有下面的代码,create
一个新的 zip 文件,然后 add entry
到这个文件 NoCompression
即 ZERO compression ratio
然后尝试阅读这个条目作为普通文本。
using System;
using System.IO;
using System.IO.Compression;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
using (FileStream zipToOpen = new FileStream(@"d:\release.zip", FileMode.Create))
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))
{
ZipArchiveEntry readmeEntry = archive.CreateEntry("Readme.txt", CompressionLevel.NoCompression);
using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
{
writer.WriteLine("Information about this package.");
writer.WriteLine("========================");
}
}
}
string text = System.IO.File.ReadAllText(@"d:\release.zip\Readme.txt");
Console.WriteLine("Contents of WriteText.txt = {0}", text);
}
}
}
zip 文件及其条目均已创建,我可以从 windows 资源管理器访问它们,但是一旦代码尝试读取它,就会出现以下错误:
Unhandled Exception: System.IO.DirectoryNotFoundException: Could not find a part of the path 'd:\release.zip\Readme.txt'. at System.IO.Win32FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions opti ons, FileStream parent) at System.IO.Win32FileSystem.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions o ptions, FileStream parent) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) at System.IO.File.InternalReadAllText(String path, Encoding encoding)
at System.IO.File.ReadAllText(String path) at ConsoleApplication.Program.Main(String[] args)
首先需要注意的是,您并没有创建一个zip文件,您创建的是一个特定压缩率的归档文件;在您的情况下,您创建了一个未压缩的 ZIP 存档。
and I can access them from the windows explorer
我不能,因为我有 7zip 与 .zip
文件关联,所以 7z 打开存档;在你的情况下 Windows Explorer 正在为你做这件事。因此,当您浏览到 .zip
文件并打开它时,资源管理器会将存档文件视为一个文件夹并向您显示存档的内容。
但是,当您这样做时:
string text = System.IO.File.ReadAllText(@"d:\release.zip\Readme.txt");
System.IO.File.ReadAllText
将打开您作为参数传递的特定文件,在您的情况下为 d:\release.zip\Readme.txt
。因此试图打开的路径是:驱动器 D:
、文件夹 release.zip
、文件 Readme.txt
... 因为 d:\release.zip
是一个 文件 而不是 文件夹 ,找不到路径,这就是为什么您会收到 DirectoryNotFoundException
异常。
为此,如果您想阅读该条目,只需按照您对 Create
存档所做的操作即可,除了来自 Open
的存档的 Read
和 .GetEntry
而不是 .CreateEntry
,例如:
string text = string.Empty;
using (FileStream zipToOpen = new FileStream(@"c:\test\release.zip", FileMode.Open)) {
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Read)) {
ZipArchiveEntry readmeEntry = archive.GetEntry("Readme.txt");
using (StreamReader reader = new StreamReader(readmeEntry.Open())) {
text = reader.ReadToEnd();
}
}
}
Console.WriteLine("Contents of WriteText.txt = {0}", text);
希望能帮到你。