Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
 Аватар для Orlov1
100 / 42 / 7
Регистрация: 03.02.2019
Сообщений: 657

Распаковка архивов

29.05.2025, 23:46. Показов 2847. Ответов 23

Студворк — интернет-сервис помощи студентам
Есть код, который распаковывает архивы, находящиеся в директории, используя стандартные средства Winrar и консольную команду. Подскажите как записать в коде обработку вложенных архивов, т.е если распаковали архив и в архиве еще один архив, то его распаковать с сохранением структуры каталогов.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Diagnostics;
 
class ArchiveExtractor
{
    static void Main()
    {       
        string archivesPath = ("d:\\1\\");
 
        string outputPath = PrepareOutputDirectory();
                       
        string[] archiveFiles = Directory.GetFiles(archivesPath, "*.7z")
            .Concat(Directory.GetFiles(archivesPath, "*.zip"))
            .Concat(Directory.GetFiles(archivesPath, "*.rar"))
            .ToArray();
 
        foreach (string archivePath in archiveFiles)
        {
            ProcessArchive(archivePath, outputPath);
        }
                
        Console.ReadKey();
    }
 
    private static string PrepareOutputDirectory()
    {
        string outputPath = Path.Combine(Directory.GetCurrentDirectory(), "output");
        if (!Directory.Exists(outputPath))
            Directory.CreateDirectory(outputPath);
 
        return outputPath;
    }
    
    private static void ProcessArchive(string archivePath, string baseOutputPath)
    {
        string archiveName = Path.GetFileName(archivePath);
        Console.WriteLine($"Распаковка архива {archiveName}...");
 
        try
        {
           
            string archiveFolderName = Path.GetFileNameWithoutExtension(archivePath);
            string outputPath = Path.Combine(baseOutputPath, archiveFolderName);
 
            ExtractWithWinRAR(archivePath, outputPath);
 
            Console.WriteLine($"Распаковка архива {archiveName} завершена успешно.");
            
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Ошибка при распаковке архива {archiveName}: {ex.Message}");
        }
    }
    
    private static void ExtractWithWinRAR(string archivePath, string outputPath)
    {
        string winRarPath = GetWinRarPath();
        if (winRarPath == null)
            throw new FileNotFoundException("WinRAR не найден!");
 
        Directory.CreateDirectory(outputPath);
                
        string args = $"x -ibck -y -r -o+ \"{archivePath}\" \"{outputPath}\"";
        using (Process process = new Process())
        
        {
            process.StartInfo = new ProcessStartInfo
            {
                FileName = winRarPath,
                Arguments = args,
                UseShellExecute = false,
                CreateNoWindow = true,
                RedirectStandardError = true
            };
 
            process.Start();
            process.WaitForExit();
 
            if (process.ExitCode != 0)
                throw new Exception("Ошибка при распаковке архива.");
        }
 
    }
    private static string GetWinRarPath()
    {
        string[] possiblePaths =
        {
            Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "WinRAR", "WinRAR.exe"),
            Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "WinRAR", "WinRAR.exe"),
            Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "WinRAR", "Rar.exe"),
            Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "WinRAR", "Rar.exe")
        };
 
        return possiblePaths.FirstOrDefault(File.Exists);
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.05.2025, 23:46
Ответы с готовыми решениями:

Распаковка архивов, в том числе и запароленных
Как распаковать запороленный архив WinRar или Zip, ну или хотя бы просто распаковать архив?

Распаковка rar-архивов
Перепрбывал много чего и в том числе сторонние библиотеки, вот код, надо расспаковать два архива....

Распаковка архивов в отдельные папки
имеется архив 123.rar, в нем находятся еще 3 архива 1.rar, 2.rar и 3.rar. Необходимо распаковать...

23
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
02.06.2025, 07:31
Студворк — интернет-сервис помощи студентам
а рекурсивно без контроля такое делать безопасно? вдруг какая зип бомба))) я бы вел какой-нибудь счетчик расхода места на диске и падал бы при подозрительных входных данных.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
02.06.2025, 09:24
Цитата Сообщение от golosalex Посмотреть сообщение
вдруг какая зип бомба
строго говоря забить диск можно и без бомб. Но если ожидается что файлы будут небольшие и из доверенных источников -- я бы не заморачивался.
0
02.06.2025, 09:33

Не по теме:

у нас препод по ТТП учил писать код так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
bool value = getValue();
switch(value)
{
    case true:
        //do some 1
        break;
    case false:
        //do some 2
        break;
    default:
        //шеф, всё пропало!
        break;
}

0
02.06.2025, 13:30

Не по теме:

Цитата Сообщение от belalugoci Посмотреть сообщение
у нас препод по ТТП учил писать код так
Да норм, чо, он глядел в будущее, bool?:
C++
1
2
3
4
5
6
7
8
9
10
tribool b = some_operation();
if (b) {
  // b is true
}
else if (!b) {
  // b is false
}
else {
  // b is indeterminate
}

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.06.2025, 13:30

Распаковка архивов
Пишу программу на c#. Она у меня распознает документы ворд и записывает их в таблицу. Теперь нужно...

Запуск архивов по очереди
Здравствуйте бьюсь над следующей проблемой на форме есть progressBar1 который должен менять свое...

Склеивание архивов GZipStream - Неверный размер файла
Всем привет. Пишу архиватор, который делит исходный файл на фрагменты, их жмёт GZipStream, далее...

Параллельное создание zip архивов на WEB странице останавливается
Не веб-сайте есть страничка "Создать архивы". Жму кнопку, создаются пустые архивы и начинается...

Подвисания при распаковке архивов из ресурсов
Приветствую! Разрабатываю свой WPF, в ресурсах лежит большое количество тяжеловесных zip архивов....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru