2011-11-04 2 views
1

Мне нужно добавить индикатор прогресса в моем AV, и проблема в том, что я не знаю заранее, сколько файлов нужно сканировать. Так что я не знаю итогового count.If я считаю файлы, которые будут отсканировано, затем мягкие паузы на некоторое время, так как он должен пройти через многие файлы, а в случае полного сканирования системы - эта пауза, если она длительная, что нежелательно. Я отказался от этого кода. Я слышал, что avast динамически меняет индикатор выполнения значение, т. е. если значение приближается к 100 и более файлам для сканирования, оно подталкивает значение к значению 50. Кодирование находится на C#.AntiVirus ProgressBar

+8

Вы создаете собственное антивирусное программное обеспечение и не знаете, как получить количество файлов в системе? Что более удручающе, вы пытаетесь сделать это на C#. Если при сканировании система вызывает паузу, это означает, что поток сканирования блокирует поток ui, вы должны решить это, прежде чем беспокоиться о индикаторе выполнения. –

+3

Почему бы не использовать два потока, один для AV и один, который будет определять количество файлов, которые будут сканироваться, и это увеличит максимальное значение индикатора выполнения. Вы не можете точно знать, сколько будет файлов, поскольку пользователь может создавать/удалять файлы во время сканирования. – Nasreddine

+0

@ Ramhound-вы не получили то, что я говорил. Я знаю, как получить общее количество файлов, я делаю это рекурсивно, но когда я считаю их в рекурсивном цикле из-за тысяч файлов, я испытываю пауза из-за этого цикла подсчета. После этого нет никакой проблемы при сканировании. Сканирование в порядке - –

ответ

1

Было бы глупо пытаться получить список всех файлов за один проход, прежде чем обновлять интерфейс.

Использование потоков; один для поиска файлов и добавления их мест в очередь и обновления общего количества файлов.

Другое, чтобы выполнить сканирование и обновить количество отсканированных файлов.

и поток пользовательского интерфейса обновит себя на основе этого; поэтому верхняя граница будет постоянно увеличиваться ... или, становясь более точной.

+1

Это, кажется, лучшее решение. Было бы очень мало вычислить количество файлов, которые нужно отсканировать. Вы даже можете найти, затем сканировать файл, вы даже можете использовать службу индексов, встроенную в окна, для определения количества файлов. –

+0

и не забудьте также правильно синхронизировать ddata через потоки. –

0

Я бы рекомендовал проверить, сколько занимаемого пространства на диске и оценить количество файлов на основе плотности: файлы на ГБ. Сначала вам нужно сделать предположение, сколько файлов хранится в одном GB (для моей системы это 3860). Во время сканирования вы узнаете, что такое реальная плотность отсканированного жесткого диска, чтобы вы могли отрегулировать количество файлов.

Корректировка общего количества файлов во время сканирования - лучший способ, который я могу придумать, и быть пользователем вашего приложения. Я бы хотел его гораздо больше, чем ждать, пока вы не посчитаете все файлы на машине.

+1

Это было бы хуже, если бы не полное сканирование диска. –

+0

Мое решение помогает с проблемой не показывать индикатор выполнения в течение периода проверки количества файлов, которые будут сканироваться. Предложение с использованием двух потоков - это пользовательский интерфейс или кончик производительности и ничего не говорит о количестве файлов для сканирования. BTW, используя два потока, когда оба требуют ввода IO, не будут ускоряться. Как всегда, когда у вас есть такая проблема, самое лучшее, что вы можете сделать, это проверить возможные варианты. –

+0

Простая логика: добавление размера списка файлов требует сначала знать, какие файлы складывать. Это потребует гораздо больших усилий (относительно), чем просто знание количества файлов. Опять же, если вы не говорите только о полном сканировании дисков. –

0

Поскольку сканирование AV должно происходить на регулярной основе, вы можете просто запомнить, сколько файлов было в последнем сканировании, а затем наложить его на 5%? Это дало бы пользователю приблизительное представление о том, сколько времени потребуется, без необходимости делать полноценное полное сканирование прямо сейчас. Чтобы получить точный номер для первого сканирования, вам нужно будет выполнить полный поиск по каталогам и перенести описанную вами паузу. Что касается индивидуальных индивидуальных папок, вы можете либо сохранить # файлов для первых 2-3 уровней папок, а затем просто выполнить сканирование каталога ниже этого, так как в каждом подкаталоге будет уменьшено количество файлов.

+1

Это означает, что исходный вопрос все еще стоит, и на него не ответил. –

+0

Но как насчет пользовательского сканирования, когда пользователь выбирает конкретную папку ... Как отслеживать все папки и файлы внутри них? Вы говорите, что только для полного сканирования я могу использовать то, что вы сказали. Интересно посмотреть. Не могли бы вы рассказать о нем? –

+0

Это идея, отличная от вашей, ОП может определить достоинства идеи, основанной на всех фактах, которые он рассказывал и не рассказывал. Оговорки четко выражены как общим языком, так и термином «грубая идея». – PlTaylor

1

Просто посчитайте папки с 5 уровнями глубины и подсчитайте прогресс в зависимости от того, сколько из этих папок было отсканировано. Увеличьте уровень, чтобы повысить точность (за счет времени предварительного расчета). Используйте эту статью, чтобы научиться перечислять каталоги как можно быстрее: MSDN How to: Enumerate Directories and Files