从压缩率为 "ZERO" 的 "Zip" 文件中读取文件文本

reading file text from a "Zip" file with "ZERO" compression ratio

我有下面的代码,create 一个新的 zip 文件,然后 add entry 到这个文件 NoCompressionZERO 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);

希望能帮到你。