Импорт папок cо вложенными папками и файлами
Рассмотрим случай, когда необходимо добавить каталог (папку, директорию) с подкаталогами и файлами из операционной системы в хранилище документов ELMA. Реализуем этот функционал с помощью процесса.
При запуске процесса необходимо указать входные параметры:
Самый простой способ реализации алгоритма при добавлении папок – использовать рекурсию и реализовать всё в одном сценарии. Но этот вариант нам не подходит, т.к. может сработать ограничение - 10 минутный таймаут при выполнении сценария. Для этого делим логику процесса на 3 отдельных сценария: инициализация, добавление папки и добавление файлов из текущей папки.
В инициализации получаем список всех папок, содержащихся в указанной папке «Папка откуда» и создаём корневую папку и документы типа Файл, в версиях которых сохраняем файлы. Затем перебором создаём папки и файлы из них, отслеживая возможные ошибки с помощью специальной задачи.
Количество папок не ограничено (кроме размера свободного места в папке на сервере ELMA, где хранятся файлы).
Вы можете доработать процесс и добавить следующий функционал самостоятельно:
- возможность указывать маску, по которой будут фильтроваться файлы;
- возможность указывать и добавлять вложенные каталоги.
Или доработать любую логику при добавлении папок в систему ELMA: расфасовать по разным папкам, типам документов и т.п..
Сам процесс может быть импортирован из приложенного файла.
Текст сценария:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using EleWise.ELMA.API; using EleWise.ELMA.Documents.Models; using EleWise.ELMA.Files; using EleWise.ELMA.Logging; using EleWise.ELMA.Model.Common; using EleWise.ELMA.Model.Entities; using EleWise.ELMA.Model.Entities.ProcessContext; using EleWise.ELMA.Model.Managers; using EleWise.ELMA.Model.Services; using EleWise.ELMA.Model.Types.Settings; using EleWise.ELMA.Runtime.Managers; using EleWise.ELMA.Services; using Context = EleWise.ELMA.Model.Entities.ProcessContext.P_ImportPapok; |
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 | namespace EleWise.ELMA.Model.Scripts { /// <summary> /// Модуль сценариев процесса "Импорт папок" /// </summary> public partial class P_ImportPapok_Scripts : EleWise.ELMA.Workflow.Scripts.ProcessScriptBase<Context> { // Класс для хранения соответствия полного пути к папке и папки в Элма private class FolderMap { public string FullName; public Folder ElmaFolder; } static String[] allfiles = null ; // массив путей к каталогам static List<FolderMap> folderMap = new List<FolderMap>(); // список соответствий public void Init(Context context) { // получить список папок allfiles = System.IO.Directory.GetDirectories(context.PapkaOtkuda, "*" ,System.IO.SearchOption.AllDirectories); context.Kol = allfiles.Count(); context.Current = 0; context.CurrentElmaFolder = context.PapkaKuda; CreateFolderAtom(context, context.CurrentElmaFolder, context.PapkaOtkuda); // перенос корневого каталога CreateFilesAtom(context, context.PapkaOtkuda); // перенос файлов из корневого каталога } // метод создаёт папку в Элма public void CreateFolder(Context context) { // поиск родительской папки Folder folder = GetCurrentFolderElma(context, allfiles[( int )context.Current]); Logger.Log.Error(folder.Name); // создание каталога в Элме CreateFolderAtom(context, folder, allfiles[( int )context.Current]); } // перенос файлов в Элму из текущего каталога public void CreateFiles(Context context) { CreateFilesAtom(context, allfiles[( int )context.Current]); context.Current++; } // Создание файлов в Элме из текущего каталога public void CreateFilesAtom(Context context, string pathToFiles) { DirectoryInfo di = new DirectoryInfo(pathToFiles+ "\\" ); foreach (var element in di.GetFiles( "*" ,SearchOption.TopDirectoryOnly)) { Logger.Log.Error(element.Name); CreateFileAtom(context, context.CurrentElmaFolder, element.FullName); } } // возвращает родительскую папку в Элме для указанного FullFolderName public Folder GetCurrentFolderElma(Context context, string FullFolderName) { Folder folder = context.PapkaKuda; string path = Path.GetDirectoryName(FullFolderName); foreach (var element in folderMap) { if (element.FullName == path) return PublicAPI.Docflow.Folder.Load(element.ElmaFolder.Id); } return folder; } // Создание папки в Элме public void CreateFolderAtom(Context context, Folder folderParent, string folderSystem) { Logger.Log.Error(folderSystem); string lastFolderName = Path.GetFileName( folderSystem ); Logger.Log.Error(lastFolderName); Folder folder = PublicAPI.Docflow.Folder.CreateFolder(folderParent,lastFolderName, true , false ); folder.Save(); context.CurrentElmaFolder = PublicAPI.Docflow.Folder.Load(folder.Id); FolderMap fm = new FolderMap(); fm.FullName = folderSystem; fm.ElmaFolder = context.CurrentElmaFolder; folderMap.Add(fm); Logger.Log.Error(context.Current.ToString()+ ":" +fm.FullName + "+++" + fm.ElmaFolder.Name); } public void CreateFileAtom(Context context, Folder folderParent, string filename) { // создание системного файла в Элме context.File = InterfaceActivator.Create<BinaryFile>(); context.File.Name = Path.GetFileName(filename); context.File.CreateDate = DateTime.Now; context.File.InitializeContentFilePath(); System.IO.File.Copy(filename, context.File.ContentFilePath); // копирование файла из операционной системы Locator.GetServiceNotNull<IFileManager>().SaveFile(context.File); // сохранить файл в Элма // создание документа типа File в Элма var doc = PublicAPI.Docflow.Types.File.Create(context.File, folderParent, context.File.Name ); doc.Save(); } } } |