Хобрук: Ваш путь к мастерству в программировании

Можно ли сжать папки вместе в С#?

Например, если у меня есть папка с именем 2016, а внутри этой папки есть папки Jan-Dec и другие файлы, есть ли способ заархивировать эти папки вместе в 2016.zip? Все, что я пробовал, объединяет ВСЕ файлы в папке, но я хочу сжать вместе ТОЛЬКО папки и никакие другие файлы в папке.

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

Следующий код захватывает ФАЙЛЫ, начинающиеся с 00, но не папки.

// Where the files are located
string strStartPath = txtTargetFolder.Text;

// Where the zip file will be placed
string strZipPath = @"C:\Users\smelmo\Desktop\testFinish\" + strFileNameRoot + "_" + txtDateRange1.Text.Replace(@"/", "_") + "_" + txtDateRange2.Text.Replace(@"/", "_") + ".zip";

if(File.Exists(strZipPath))
{
    File.Delete(strZipPath);
}

using (ZipArchive archive = ZipFile.Open(strZipPath, ZipArchiveMode.Create))
{
    foreach (FileInfo file in new DirectoryInfo(strStartPath).GetFiles())
    {
                if (file.Name.StartsWith("00"))
                {
                    var entry = archive.CreateEntryFromFile(Path.Combine(file.Directory.ToString(), file.Name), file.Name);
                }
    }
}

Я также пытался использовать typeof(), но он не захватывает папки или что-то еще.

using (ZipArchive archive = ZipFile.Open(strZipPath, ZipArchiveMode.Create))
    {
        foreach (FileInfo file in new DirectoryInfo(strStartPath).GetFiles())
        {
                Type t = file.GetType();
                if (t.Equals(typeof(Directory)))
                {
                    var entry = archive.CreateEntryFromFile(Path.Combine(file.Directory.ToString(), file.Name), file.Name);
                }            
    }

EDIT: добавлены подробности для ясности


  • Просто чтобы уточнить, вам нужен почтовый индекс с пустыми папками, верно? 12.06.2017
  • @ CodyG.Нет, в папках с января по декабрь будут файлы. Я хотел бы заархивировать папки января-декабря вместе. Таким образом, при открытии 2016.zip будут папки января-декабря, а затем эти папки будут иметь соответствующие файлы. 12.06.2017
  • Почему бы тебе не попробовать DirectoryInfo(strStartPath).GetDirectories ? .GetFiles() не возвращает каталоги... 12.06.2017
  • Я бы создал файловую структуру на диске, а затем использовал: ZipFile.CreateFromDirectory(strStartPath, strZipPath); Что будет включать в себя папки для вас. 12.06.2017

Ответы:


1

Со следующей структурой папок:

введите здесь описание изображения

Этот код (обновленный):

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

class Program
{
    static void Main(string[] args)
    {
        string sourceFolder = @"c:\temp";
        string zipFilePath = Path.Combine(sourceFolder, "test.zip");

        // TODO: Check if the archive exists maybe?

        using (ZipArchive archive = ZipFile.Open(zipFilePath, ZipArchiveMode.Create))
        {
            foreach (var directoryName in Directory.GetDirectories(sourceFolder))
            {
                foreach (var filePath in Directory.GetFiles(directoryName))
                {
                    var dirInfo = new DirectoryInfo(directoryName);
                    var fileName = Path.GetFileName(filePath);

                    var entry = archive.CreateEntry($"{dirInfo.Name}\\{fileName}");
                }
            }
        }
    }
}

производит этот почтовый индекс:

введите здесь описание изображения

12.06.2017
  • Но если бы я хотел, чтобы zip был папками, а не файлами .txt, я бы просто вынул последний foreach и создал запись для каждого имени каталога? 13.06.2017
  • Я не совсем понимаю, что вы имеете в виду. Вам нужен только zip с пустыми папками январь-декабрь? 13.06.2017
  • Я также попытался использовать точный код (изменив исходную папку), и почтовый индекс пуст. 13.06.2017
  • Нет, мне нужен zip, чтобы содержать папки с января по декабрь, причем в каждой папке есть соответствующие файлы. 13.06.2017
  • Хорошо, я обновил код, а также протестировал его. Теперь он создает почтовый индекс с относительными путями. Я думаю, это то, что вы ищете. 13.06.2017
  • Это именно то, что я ищу. Таким образом, относительные пути будут включать файлы в них? Я просто пытаюсь понять/извлечь уроки из того, что сбивало меня с толку. Спасибо тебе за помощь! 13.06.2017
  • Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...