首页 文章

从具有“ZERO”压缩比的“Zip”文件中读取文件文本

提问于
浏览
-1

我有下面的代码, 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资源管理器访问它们,但是一旦代码尝试读取它,就会出现以下错误:

未处理的异常:System.IO.DirectoryNotFoundException:找不到路径'd:\ release.zip \ Readme.txt'的一部分 . System.IO.Win32FileSystem.Open的System.IO.Win32FileStream..ctor(字符串路径,FileMode模式,FileAccess访问,FileShare共享,Int32 bufferSize,FileOptions opti ons,FileStream parent)(String fullPath,FileMode模式,FileAccess访问, System.IO.File.InternalReadAllText(String)中的System.IO.FileStream.Init(String路径,FileMode模式,FileAccess访问,FileShare共享,Int32 bufferSize,FileOptions选项)中的FileShare共享,Int32 bufferSize,FileOptions o ptions,FileStream parent)路径,编码编码)在ConsoleApplication.Program.Main(String [] args)的System.IO.File.ReadAllText(字符串路径)

1 回答

  • 4

    首先应该注意的是,你没有创建一个zip文件,你创建了一个具有特定压缩的存档文件;在您的情况下,您创建了一个没有压缩的ZIP存档 .

    我可以从Windows资源管理器访问它们

    我不能,因为我有7zip与 .zip 文件相关联,所以7z打开存档;在您的情况下Windows资源管理器正在为您执行此操作 . 因此,当您浏览到 .zip 文件并将其打开时,Explorer会将存档文件视为文件夹并显示存档的内容 .

    但是,当你这样做时:

    string text = System.IO.File.ReadAllText(@"d:\release.zip\Readme.txt");
    

    System.IO.File.ReadAllText 将打开您传递的特定文件作为参数,在您的情况下为 d:\release.zip\Readme.txt . 所以试图打开的路径是:drive D: ,文件夹 release.zip ,文件 Readme.txt ...因为 d:\release.zipfile 而不是 folder ,找不到路径,这就是为什么你得到 DirectoryNotFoundException 异常 .

    对此,如果您想阅读该条目,只需对 Create 存档执行操作,但 Open 'ed存档中的 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);
    

    希望能有所帮助 .

相关问题