Архивация файлов с помощью сценария
В данной статье рассмотрен сценарий, который позволяет объединить группу файлов в 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);
}
Пример процесса с использованием данного сценария находится во вложении.