ProgressBar при Сканировании Жесткого диска

Вы не можете. Порядок событий следующий:

  1. OpenScript() вызывается - один раз за партию.
  2. ReleaseDoc() вызывается - один раз для документа
  3. 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);
5
задан Brian 27 January 2009 в 22:27
поделиться

6 ответов

Если бы Вы не можете рекурсивно вызвать структуру каталогов, так как это взяло бы пока выполнение задачи во-первых, лучшее, которое можно сделать, предположить сколько папок, там. Серьезно.

Возможно, можно использовать алгоритм на основе прошлого (например, в прошлый раз, когда я сделал это было 150 каталогов всего, когда было 10 каталогов верхнего уровня, поэтому хорошее предположение будет 15 раз текущим количеством каталогов верхнего уровня).

Другой способ сказать пользователю, что-то собирается требовать времени (не зная точно, сколько времени), должен использовать таймер обратного отсчета. Даже если Вы предположили, что что-то займет больше времени, чем это на самом деле будет (сказать 5 минут, когда это будет действительно 3-минутная задача), по крайней мере, пользователь знает примерно, сколько времени это собирается взять. И они будут более счастливыми, когда это закончится быстрее, чем им сказали, что это будет. Единственная неприятность, конечно, то, если Вы не угадываете с другой стороны, т.е. если что-то занимает больше времени, чем Вы думали, что это было бы. Затем они находятся, там ожидая чего-то для окончания, это (в их уме) уже должно было закончиться.

0
ответ дан 13 December 2019 в 05:43
поделиться

Просто не используйте его. Попробуйте что-то более соответствующее как вращающаяся анимация или панель стиля Kitts: http://en.wikipedia.org/wiki/KITT.

2
ответ дан 13 December 2019 в 05:43
поделиться

Если необходимо сделать индикатор выполнения, и Вы не можете сэкономить время, которое требуется для сбора достоверной информации, то Вы не собираетесь быть способными сделать идеальный индикатор выполнения. С тем предположением в памяти, можно все еще сделать индикатор выполнения, который не абсолютно неточен.

Например, Вы делаете функцию, которая подразделяет индикатор выполнения в зависимости от количества подкаталогов в текущем каталоге. Таким образом, если Ваш корневой каталог имеет 10 подкаталогов, выделите 10% индикатора выполнения к каждому из тех каталогов. Затем введите в первый подкаталог и считайте его подкаталоги. Если это имеет 5, выделите 20% первых 10% индикатора выполнения каждому из тех (2% общего индикатора выполнения). Продолжите как это, пока Вы не достигаете каталога без подкаталогов, сделайте свою обработку там и увеличьте индикатор выполнения безотносительно дробной суммы, которую это представляет.

Каждый % на индикаторе выполнения не представит тот же объем работы, сделанный алгоритмом, но, учитывая Ваши ограничения я сомневаюсь, что можно сделать намного лучше.

8
ответ дан 13 December 2019 в 05:43
поделиться

Можно сделать это несколькими способами.... простой процесс, который не мог бы быть на 100% точным.

Прежде чем Вы запустите, получите количество файлов, затем используйте, это для вычисления процента завершения, после обработки X файлов обновляет прогресс. Предоставленный существует стоимость производительности поиска. Возможно, просто получите количество корневых каталогов, и поскольку Вы пересекаете, обновляют прогресс.

Другая опция могла бы быть для простой записи количества "последнего выполнения" детали и использование что вычислить процент, снова, не обязательно точных 100%, но опция.

Я предполагаю несколько других вещей, которые приходят на ум, должен просто показать пользователю "в прогрессе" диалоговое окно и даже не попытаться получить процент. Иначе, возможно, просто покажите текущий рабочий каталог, показав, что Вы делаете успехи.

1
ответ дан 13 December 2019 в 05:43
поделиться

Я пытался захватить stdoutput"dir/ad/b/s c:/"и подсчет количества строк. Это довольно быстро. Это достаточно защищено для использования в progressbar, но не достаточно защищено для использования в качестве списка каталогов.

1
ответ дан 13 December 2019 в 05:43
поделиться

Можно создать индикатор выполнения с постепенным увеличением свойств 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

Можно экспериментировать на начальном Максимальном значении, чтобы иметь более гладкое перемещение индикатора выполнения.

0
ответ дан 13 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: