В сегодняшнем уроке мы узнаем, как архивировать файлы в C#. Стандартными средствами делать это не очень удобно, так что в этой статье мы будем использовать специальную библиотеку — Ionic Zip. Скачать её можно внизу статьи либо по этой ссылке.
Для наглядного примера работы напишем небольшую программу на Windows Forms. Так будет выглядеть её внешняя оболочка. В TextBox’e будет выводиться путь файла, который пользователь решит архивировать, кнопкой «Выбрать файл» будет вызываться меню обзора папок для архивации, а при нажатии на кнопку «Сохранить архив» пользователь сможет выбрать путь, в который будет сохранен архив и, собственно, произойдёт само сохранение. Мы поставили в TextBox’e свойство ReadOnly в значение True, чтобы пользователь не мог изменять путь исходной папки — это необязательное действие.
Теперь нам надо добавить библиотеку. Для этого в «Обозревателе решений» щёлкаем правой кнопкой мыши на вкладку References, в появившемся меню нажимаем «Добавить ссылку…»
В появившемся окне выбираем вкладку «Обзор», затем нажимаем на кнопку «Обзор» в правом нижнем углу и находим файл Ionic.Zip.dll. Проверяем, стоит ли после добавления библиотеки напротив её названия галочка.
Если всё верно, возвращаемся к коду и подключаем библиотеку:
1 |
using Ionic.Zip; |
С библиотекой разобрались, теперь начинаем кодить. Перво-наперво мы инициализируем класс FolderBrowserDialog, который даёт пользователю возможность выбора папки в окне обзора. Нам это нужно для выбора папки, которую мы будет архивировать.
1 |
FolderBrowserDialog bd = new FolderBrowserDialog(); |
Теперь мы переходим к конструктору форм и дважды кликаем на кнопку «Выбрать файл». Код данной кнопки состоит всего из пары строк:
1 2 3 4 5 6 7 |
private void button1_Click(object sender, EventArgs e) { if (bd.ShowDialog() == DialogResult.OK) { textBox1.Text = bd.SelectedPath; } } |
При нажатии на данную кнопку открывается окно «Обзор папок», и если в данном окне будет нажата кнопка «ОК», то в TextBox запишется путь нахождения данной папки.
Теперь в конструкторе форм нажимаем на кнопку «Сохранить архив».
Код этой кнопки такой:
1 2 3 4 5 6 7 8 9 10 11 12 |
private void button2_Click(object sender, EventArgs e) { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "Zip files (*.zip)|*.zip"; if (textBox1.Text!="" && sfd.ShowDialog() == DialogResult.OK) { ZipFile zf = new ZipFile(sfd.FileName); zf.AddDirectory(bd.SelectedPath); zf.Save(); MessageBox.Show("Архивация прошла успешно.", "Выполнено"); } } |
Сначала мы инициализируем класс SaveFileDialog, который предоставляет пользователю выбрать путь для сохранения какого-либо файла. Также мы настроим фильтр для sfd, который не даст пользователю сохранить файл в каком-либо другом формате кроме .zip.
Если TextBox не пуст и в SaveFileDialog’e с именем sfd будет нажата кнопка «Сохранить» (аналогично «ОК»), то начинает работу наша библиотека. Мы создаем новый класс ZipFile и в нём указываем путь сохранения архива, у нас это путь, выбранный через класс SaveFileDialog.
Примечание: можно обойтись без SaveFileDialog и т.п., если в скобках указать какой-либо статический путь, например так: ZipFile zf = new ZipFile(«C:\Users\Denis\Desktop\archive.zip);
В следующей строке мы указываем путь к файлу, который мы будем архивировать — в нашем случае это папка, выбранная через кнопку «Выбрать файл».
Строка zf.Save(); сохраняет файл из строки 8 по пути, написанному в строке 7.
Затем для удобства появляется сообщение об удачной архивации, можно проверять архив по пути, указанному через SaveFileDialog.
Вот такая простая программа, вот такая удобная библиотека.
Примечание: единственный существенный минус данной библиотеки — неприятие кириллицы в файлах внутри архивов. Если в папке, которую Вы хотите заархивировать имеются файлы на русском или украинском, то после архивации их названия будут выглядеть примерно так:
Скачать нашу программу а также библиотеку Ionic Zip можно по ссылкам ниже:
Скачать исходник Скачать библиотеку на С#
Поделиться в соц. сетях:
Ругается на
zf.Save();
Необработанное исключение типа «System.IO.FileNotFoundException» в Ionic.Zip.dll
Проверил работоспособность программы в Visual Studio 2013 — всё в норме.
Может попробовать заново подключить dll в References ?
Я уже разобрался, спасибо :)
ZipFile zip = ZipFile.Read(«zip.zip»);
foreach (ZipEntry zip_ex in zip)
{
zip_ex.Extract(dir_vol, ExtractExistingFileAction.DoNotOverwrite);
}
А разархивировать как с помощью её?
// путь к архиву
String sourcePath = «…»;
using (Ionic.Zip.ZipFile zip = Ionic.Zip.ZipFile.Read(sourcePath))
{
zip.ExtractAll(«путь, куда разархивировать», Ionic.Zip.ExtractExistingFileAction.DoNotOverwrite);
}
Спасибо. Ваш урок пригодился для небольшого проекта ))
PS В в стандартные способы в С# 8 разве не удобны?? Или они более «многословны»??