Вы не можете. Порядок событий следующий:
OpenScript()
вызывается - один раз за партию. ReleaseDoc()
вызывается - один раз для документа CloseScript()
вызывается - один раз для партии. Коллекция значений содержит информацию, относящуюся к отдельному документу, и, как таковая, будет пустой во время OpenScript()
. Иногда это не то, что вам нужно - вы можете получить доступ к значениям другого документа или экспортировать их все сразу, например. в одном вызове веб-службы.
Вот что я бы порекомендовал:
Создайте класс-оболочку для объекта Kofax 'Document
. Вот мой подход (показаны только свойства). Этот класс имеет конструктор, который принимает объект ReleaseData
в качестве единственного параметра, и все соответствующие свойства заполняются в указанном конструкторе.
public class Document
{
public Dictionary<string, string> BatchFields { get; private set; }
public Dictionary<string, string> IndexFields { get; private set; }
public Dictionary<string,string> KofaxValues { get; set; }
public Dictionary<string, string> TextConstants { get; set; }
public Dictionary<string, string> CustomProperties { get; private set; }
public Dictionary<string,string> ConfigurationSettings { get; set; }
public List<Table> Tables { get; private set; }
private List<Column> Columns;
public List<string> ImageFileNames { get; private set; }
public string KofaxPDFFileName { get; private set; }
public string XdcFilePath { get; private set; }
public XDocument XDocument { get; private set; }
public string ImageFilePath { get; private set; }
public string KofaxPDFPath { get; private set; }
public string TextFilePath { get; private set; }
public byte[] BinaryImage { get; private set; }
public char CellSeparator { get; set; }
}
Затем, во время ReleaseDoc()
, я просто добавил все свои Documents
в коллекцию. Обратите внимание, что соединение documents
определено как частное в вашем ReleaseScript
:
public KfxReturnValue ReleaseDoc()
{
documents.Add(new Document(DocumentData));
}
Затем вы можете решить, когда и куда экспортировать ваши данные. Это также может быть во время события CloseScript (), но имейте в виду, что проверки работоспособности и потенциальные исключения, связанные с данными документа (недопустимые значения полей индекса и т. Д.), Должны выполняться в течение ReleaseDoc()
. Использование пользовательского класса-обертки и коллекции добавляет большую гибкость и функции, встроенные в .NET, в ваш Export Connector, например LINQ - вот пример (это невозможно с COM-объектами Kofax):
var noPdfs = documents.Where(x => x.KofaxPDFPath.Length == 0);
Если бы Вы не можете рекурсивно вызвать структуру каталогов, так как это взяло бы пока выполнение задачи во-первых, лучшее, которое можно сделать, предположить сколько папок, там. Серьезно.
Возможно, можно использовать алгоритм на основе прошлого (например, в прошлый раз, когда я сделал это было 150 каталогов всего, когда было 10 каталогов верхнего уровня, поэтому хорошее предположение будет 15 раз текущим количеством каталогов верхнего уровня).
Другой способ сказать пользователю, что-то собирается требовать времени (не зная точно, сколько времени), должен использовать таймер обратного отсчета. Даже если Вы предположили, что что-то займет больше времени, чем это на самом деле будет (сказать 5 минут, когда это будет действительно 3-минутная задача), по крайней мере, пользователь знает примерно, сколько времени это собирается взять. И они будут более счастливыми, когда это закончится быстрее, чем им сказали, что это будет. Единственная неприятность, конечно, то, если Вы не угадываете с другой стороны, т.е. если что-то занимает больше времени, чем Вы думали, что это было бы. Затем они находятся, там ожидая чего-то для окончания, это (в их уме) уже должно было закончиться.
Просто не используйте его. Попробуйте что-то более соответствующее как вращающаяся анимация или панель стиля Kitts: http://en.wikipedia.org/wiki/KITT.
Если необходимо сделать индикатор выполнения, и Вы не можете сэкономить время, которое требуется для сбора достоверной информации, то Вы не собираетесь быть способными сделать идеальный индикатор выполнения. С тем предположением в памяти, можно все еще сделать индикатор выполнения, который не абсолютно неточен.
Например, Вы делаете функцию, которая подразделяет индикатор выполнения в зависимости от количества подкаталогов в текущем каталоге. Таким образом, если Ваш корневой каталог имеет 10 подкаталогов, выделите 10% индикатора выполнения к каждому из тех каталогов. Затем введите в первый подкаталог и считайте его подкаталоги. Если это имеет 5, выделите 20% первых 10% индикатора выполнения каждому из тех (2% общего индикатора выполнения). Продолжите как это, пока Вы не достигаете каталога без подкаталогов, сделайте свою обработку там и увеличьте индикатор выполнения безотносительно дробной суммы, которую это представляет.
Каждый % на индикаторе выполнения не представит тот же объем работы, сделанный алгоритмом, но, учитывая Ваши ограничения я сомневаюсь, что можно сделать намного лучше.
Можно сделать это несколькими способами.... простой процесс, который не мог бы быть на 100% точным.
Прежде чем Вы запустите, получите количество файлов, затем используйте, это для вычисления процента завершения, после обработки X файлов обновляет прогресс. Предоставленный существует стоимость производительности поиска. Возможно, просто получите количество корневых каталогов, и поскольку Вы пересекаете, обновляют прогресс.
Другая опция могла бы быть для простой записи количества "последнего выполнения" детали и использование что вычислить процент, снова, не обязательно точных 100%, но опция.
Я предполагаю несколько других вещей, которые приходят на ум, должен просто показать пользователю "в прогрессе" диалоговое окно и даже не попытаться получить процент. Иначе, возможно, просто покажите текущий рабочий каталог, показав, что Вы делаете успехи.
Я пытался захватить stdoutput"dir/ad/b/s c:/
"и подсчет количества строк. Это довольно быстро. Это достаточно защищено для использования в progressbar, но не достаточно защищено для использования в качестве списка каталогов.
Можно создать индикатор выполнения с постепенным увеличением свойств Maximum & Value. Если Вы имеете свое свойство Maximum, первоначально установленное в 100, на событии Tick Вашего Таймера, увеличиваете оба Ваших Максимума и Значение 1, например, таким образом, у Вас будут значения упомянутыми ниже...
Maximum Value
Tick1: 101 1 - 1%
Tick2: 102 2 - 2%
Tick3: 103 3 - 3%
TickN: 100+n n
Finish 100+n 100+n - 100% --> force to fill the progress bar
Можно экспериментировать на начальном Максимальном значении, чтобы иметь более гладкое перемещение индикатора выполнения.