получить список архивных файлов рекурсивно - PullRequest
0 голосов
/ 27 апреля 2018

Например, у меня есть архив с именем test.zip.

Я бы хотел, чтобы в нем были перечислены все файлы в этом архиве и архивы внутри него без разархивирования.

  • test.zip
    • 1.txt
    • 2.txt
    • subarchive.zip
      • 3.txt
      • 4.txt
    • somedir
      • 5.txt

Желательно сделать это на C # или Powershell.

Возможно ли это?

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Этого можно добиться, используя библиотеку DotNetZip следующим образом:

    static void Main(string[] args)
    {
        using (ZipFile zip = ZipFile.Read(@"d:\test.zip"))
        {
            foreach (ZipEntry e in zip)
            {
                Console.WriteLine(e.IsDirectory);
            }
        }
    }
0 голосов
/ 27 апреля 2018

вот еще одна версия для обхода архива на основе класса System.IO.Compression.ZipArchive

static void OutputEntries(ZipArchive archive) {
        foreach (ZipArchiveEntry entry in archive.Entries) {
            Console.WriteLine(entry.Name);

            if (entry.FullName.EndsWith(".zip")) {

                ZipArchive embeddedZipArchive = new ZipArchive(entry.Open());
                OutputEntries(embeddedZipArchive);

            }
        }

как @Faenrig уже указал

Если у вас есть проблемы с непосредственным использованием класса, как я, там может отсутствовать ссылка на ZipArchive.

Как объяснил пользователь 5093161 в этом сообщении: не удается найти ZipArchive в пространство имен «System.IO.Compression», вы можете установить два следующие пакеты NuGet.

NuGet System.IO.Compression NuGet 40-System.IO.Compression.FileSystem

0 голосов
/ 27 апреля 2018

Вы можете сначала взглянуть на класс ZipArchive: https://msdn.microsoft.com/en-us/library/system.io.compression.ziparchive(v=vs.110).aspx

Если у вас возникли проблемы с непосредственным использованием класса, такого как я, возможно, отсутствует ссылка на ZipArchive.

Как объяснил пользователь 5093161 в этом посте: Не удается найти `ZipArchive` в пространстве имен« System.IO.Compression » Вы можете установить два следующих пакета NuGet.

  1. NuGet System.IO.Compression
  2. NuGet 40-System.IO.Compression.FileSystem

Первым подходом может быть показ полного имени каждой записи, например ::

public void ZipTesting()
{
    string zipPath = @"c:\zipTest\TestArchive.zip";
    using (ZipArchive archive = ZipFile.OpenRead(zipPath))
    {
        foreach (ZipArchiveEntry entry in archive.Entries)
        {
            Console.WriteLine(entry.FullName);
        }
    }
}
...