C# - Подсчитать все файлы в каталоге, включая Zip в Zip и т. Д. - PullRequest
0 голосов
/ 05 августа 2020

У меня есть каталог, в котором хранятся всевозможные случайные данные, включая ZIP-архивы, которые также могут включать сами ZIP-архивы и так далее. Я хочу подсчитать все данные, кроме ZIP-архивов.

Моя попытка начать подсчет данных в ZIP-файлах:

static void Main(string[] args)
        {
            DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\Temp");
            int count = 0;

            foreach (FileInfo file in directoryInfo.GetFiles())
            {
                if (file.Extension.Equals(".zip"))
                {
                    count += ZipFileCount(file.FullName);
                }

            }
            Console.WriteLine(count);
        }

        public static int ZipFileCount(String zipFileName)
        {
            using (ZipArchive archive = ZipFile.Open(zipFileName, ZipArchiveMode.Read))
            {
                foreach (var entry in archive.Entries)
                {
                    if (!String.IsNullOrEmpty(entry.Name))
                    {
                        count += 1;

                        if (entry.Name.Substring(entry.Name.Length - 3).Equals("zip"))
                        {
                            ZipFileCount(entry.Name);
                        }

                    }

                }
                return count;
            }
        }

Это не сработало как ZipFileCount(entry.Name) не предоставляет правильные записи в ZIP-архиве.

Кто-нибудь может помочь мне исправить это?

1 Ответ

1 голос
/ 06 августа 2020

Один из способов достижения этого - рекурсивное извлечение всех zip-архивов во временную папку с последующим подсчетом не-zip-файлов внутри этих каталогов. Как только мы получим счет, мы можем удалить промежуточные файлы и вернуть систему в исходное состояние. Помните, что пользователь должен иметь права на запись в файловой системе для запуска кода в этом конкретном каталоге.

using System;
using System.IO;
using System.IO.Compression;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
        
            DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\Temp");
        
            ProcessDirectory(directoryInfo); // Process the directory and extract any zip files.
        
            int count = 0;
            foreach (DirectoryInfo subdirectory in directoryInfo.EnumerateDirectories())
            {
                if (subdirectory.Name.EndsWith(".ExtractedFiles")) // Count only extracted zip files in root directory.
                {
                    count = CountFiles(subdirectory, count);
                }
            }

            DeleteIntermediateFiles(directoryInfo); // Delete the extracted files.

            Console.WriteLine(count);
        }

        public static void ProcessDirectory(DirectoryInfo directoryInfo)
        {
            foreach (DirectoryInfo subdirectory in directoryInfo.EnumerateDirectories())
            {
                ProcessDirectory(subdirectory); //Process subdirectories.
            }

            ProcessFiles(directoryInfo); //Process files.
        }

        private static void ProcessFiles(DirectoryInfo directoryInfo)
        {
            foreach (FileInfo file in directoryInfo.EnumerateFiles())
            {
                if (file.Extension.Equals(".zip")) // extract zip files.
                {
                    var extractFilesDirectory = directoryInfo.CreateSubdirectory(
                        Path.GetFileNameWithoutExtension(file.Name) + ".ExtractedFiles");
                    ZipFile.ExtractToDirectory(file.FullName, extractFilesDirectory.FullName);
                    ProcessDirectory(extractFilesDirectory); //process extracted files.
                }
            }
        }

        public static int CountFiles(DirectoryInfo directoryInfo, int count)
        {
            foreach (DirectoryInfo subdirectory in directoryInfo.EnumerateDirectories())
            {
                count = CountFiles(subdirectory, count);
            }

            foreach (var fileInfo in directoryInfo.GetFiles())
            {
                if (fileInfo.Extension != ".zip") //exclude zip files while counting.
                    count++;
            }

            return count;
        }

        public static void DeleteIntermediateFiles(DirectoryInfo directoryInfo)
        {
            foreach (DirectoryInfo subdirectory in directoryInfo.EnumerateDirectories())
            {
                if (subdirectory.Name.EndsWith(".ExtractedFiles"))
                {
                    Directory.Delete(subdirectory.FullName, true);
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...