Архивация файлов с помощью сценария

В данной статье рассмотрен сценарий, который позволяет объединить группу файлов в zip-архив.

Для этого необходимо подключить сборку ICSharpCode.SharpZipLib.Zip.

Пространства имен:

using ICSharpCode.SharpZipLib.Zip;
using System.IO;
using EleWise.ELMA.Model.Services;
using EleWise.ELMA.Files;

Контекстные переменные:

context.Attachments – вложение (многие-ко-многим);
context.ArchiveFile – файл;
context.WorkflowInstance – экземпляр процесса Workflow (Объект).

Текст сценария:

public virtual void ArchiveCreation (Context context)
{          
   // Получение файлов для архивирования.
   List<BinaryFile> files = new List<BinaryFile> (); // Инициализируем экземпляр класса List<T> для сбора файлов.
   foreach (var attachment in context.Attachments) // Добавляем необходимые файлы в лист files.
   {
       files.Add (attachment.File);
   }
   // Создание папки для копирования в неё файлов для архивации.
   List<string> fileInfo = new List<string> (); // Инициализируем экземпляр класса List<T> для сбора строк путей файлов и их наименований.
   foreach (var file in files) // У каждого файла берём путь и его наименование, записываем их в строку через пробел и добавляем данную информацию в лист fileInfo.
   {
       fileInfo.Add (file.ContentFilePath + " " + file.Name);
   }
   int iterator = 0; // Инициализируем переменную для последовательной нумерации файлов в архиве.
   string tempDirectory = @"C:\Windows\Temp\ELMA\" + context.WorkflowInstance.Uid.ToString () + "_TempArchive"; // Формируем строку пути для создания временной папки. У системы ELMA должен быть доступ в папку C:\Windows\Temp\ELMA.
   Directory.CreateDirectory (tempDirectory); // Создаём по указанному пути папку для временного хранения файлов для архивации.
   foreach (var info in fileInfo) // Путь и наименование каждого файла используем для копирования файлов из списка во временную папку.
   {
       iterator++;
       string docPath = info.Substring (0, info.IndexOf (" ")); // Выделяем путь и записываем его в переменную.
       string docName = info.Substring (info.IndexOf (" ") + 1); // Выделяем наименование и записываем его в переменную.
       System.IO.File.Copy (docPath, tempDirectory + @"\" + iterator.ToString () + ". " + docName); // Копируем файл во временную папку с заданным наименованием.
   }
   // Указание кодировки для архива. 
   ZipConstants.DefaultCodePage = 866;
   // Создание файла архива.
   FastZip fz = new FastZip ();
   string archiveDirectory = @"C:\Windows\Temp\ELMA\" + context.WorkflowInstance.Uid.ToString () + "_TempArchive.zip"; // Формируем строку пути создания временного файла архива. У системы ELMA должен быть доступ в папку C:\Windows\Temp\ELMA.
   fz.CreateZip (archiveDirectory, tempDirectory, false, null); // Создаём файл архива в указанной по пути временной папке и с указанным наименованием.
   // Добавление файла архива к контекстную переменную.
   var archiveFile = InterfaceActivator.Create<BinaryFile> (); // Задаём новый файл (конечный) в системе для помещения в него архива.
   archiveFile.Name = "Архив документов.zip"; // Задаём наименование конечного файла.
   archiveFile.CreateDate = DateTime.Now; // Задаём дату создания конечного файла.
   archiveFile.InitializeContentFilePath (); // Получаем путь конечного файла.
   System.IO.File.Copy (archiveDirectory, archiveFile.ContentFilePath); // Копируем файл архива в конечный файл.
   context.ArchiveFile = archiveFile; // Записываем конечный файл в контекстную переменную.
   PublicAPI.Services.File.SaveFile (context.ArchiveFile); // Сохраняем конечный файл.
   // Удаление временных файлов.
   Directory.Delete (tempDirectory, true);
   System.IO.File.Delete (archiveDirectory);
}

Пример процесса с использованием данного сценария находится во вложении.

Прикрепленные файлы