Эта программа на языке C# представляет собой консольное приложение, предназначенное для автоматического сбора содержимого определенных файлов из текущей папки и всех её вложенных подкаталогов в один итоговый текстовый файл. По сути, это инструмент для создания единого отчета или дампа исходного кода проекта.
Ниже приведено подробное описание того, как работает этот код:
1. Точка входа (метод Main)
- Определение рабочей области: Программа получает путь к текущему рабочему каталогу (
Directory.GetCurrentDirectory()), то есть той папке, из которой был запущен исполняемый файл.exe. - Генерация имени выходного файла: Имя результирующего файла создается динамически. Оно совпадает с названием текущего каталога, а расширение устанавливается как
.txt. Например, если программа запущена из папкиC:\MyProject, результат будет сохранен в файлC:\MyProject\MyProject.txt. - Обработка ошибок: Весь основной блок обернут в конструкцию
try-catch. Если при создании директорий или записи файла произойдет критическая ошибка (например, отсутствие прав доступа), она не приведет к аварийному завершению программы, а выведет понятное сообщение об ошибке в потокConsole.Error. - Запись данных: С помощью оператора
usingоткрывается объектStreamWriterдля записи текста в созданный файл. После этого вызывается рекурсивный методWalkAndCollect.
2. Рекурсивный обход (метод WalkAndCollect)
Этот метод является ядром приложения. Он принимает три параметра: корневую директорию (нужна для вычисления относительных путей), текущий обрабатываемый каталог и поток записи.
- Фильтрация по расширениям: Метод запрашивает список разрешенных расширений у функции
GetAllowedExtensions(). Затем он перебирает все файлы в текущем каталоге черезDirectory.EnumerateFiles(currentDir). Если расширение файла отсутствует в белом списке (сравнение идет без учета регистра благодаряToLowerInvariant()), файл пропускается. Это защищает программу от попыток прочитать бинарные данные (изображения, видео, архивы). - Относительные пути: Для каждого подходящего файла вычисляется его относительный путь относительно корня (
Path.GetRelativePath(rootDir, filePath)). В итоговом файле вместо полного системного пути вродеC:\Users\Admin\project\src\App.csпользователь увидит короткий путь видаsrc\App.cs. - Чтение и запись контента: Содержимое файла полностью считывается в оперативную память методом
File.ReadAllText(filePath)в кодировке UTF-8.- Сначала в выходной файл записывается заголовок раздела:
--- ОтносительныйПутьКФайлу ---. - Затем записывается само содержимое.
- Программе важна структура: перед добавлением разделителя между файлами проверяется условие
!content.EndsWith(Environment.NewLine). Если последний символ прочитанного файла — не перенос строки, программа принудительно добавляет его. Это гарантирует, что разделитель-----------------------------------------------------------------всегда начнется с новой строки, предотвращая «слипание» текстов разных файлов.
- Сначала в выходной файл записывается заголовок раздела:
- Рекурсия: После обработки всех файлов в текущей папке метод вызывает сам себя для каждой найденной подпапки (
Directory.EnumerateDirectories(currentDir)). Это позволяет программе спуститься на любую глубину вложенности каталогов.
3. Настройка фильтрации (метод GetAllowedExtensions)
Здесь жестко заданы расширения файлов, которые попадут в сборку. Список включает типичные форматы для разработки ПО:
- Код:
.cs - Текст и документация:
.txt,.md - Данные и конфиги:
.json,.xml,.config - Веб-разработка:
.html,.css,.jsДля добавления новых типов файлов пользователю достаточно вписать их расширения в этот список.