Как реализовать JProgressbar для класса SimpleFileVisitor

У меня есть простой класс посетителя файлов, который сканирует все диски на ПК, чтобы найти определенные расширения, такие как .txt. Я хочу отображать ход этой операции с помощью JProgressBar. При каждом сканировании общее количество найденных файлов может меняться. Это не позволяет мне рассчитать процент процесса для отображения на JProgressBar.

Мой код основан на следующем: рекурсивное сопоставление с образцом

Как рассчитать и отобразить процент, когда общее количество файлов постоянно меняется?


person user3498019    schedule 07.04.2014    source источник
comment
Я не верю, что есть способ узнать, сколько файлов .txt находится на ПК. Это повод для сканирования в первую очередь! Но вы можете использовать JProgressBar без отображения прогресса. Просто чтобы убедиться, что сканирование не рухнуло   -  person user2007447    schedule 07.04.2014


Ответы (2)


Проблема в том, что вы не знаете заранее, сколько у вас файлов. Как правило, у вас есть возможность дважды просмотреть файловую систему: в первый раз вы просто вводите каталоги и считаете только все файлы.

На основе этого числа вы можете рассчитать процент при втором запуске, когда вы посмотрите на сами файлы.

Это, очевидно, удлиняет процесс, и снова у вас нет прогресса при первом сканировании.

Что вы можете сделать, так это начать первое сканирование в другом потоке. Предполагая, что для сопоставления с образцом требуется больше времени, чем просто подсчет файлов, подсчет будет быстрее, и вы сможете динамически настраивать JProgressBar. Затем он начнет работать ненадежно и со временем станет более точным.

Я предполагаю, что этот подход похож на тот, который реализован в механизме копирования Windows. Они также сначала сканируют файлы без информации о ходе выполнения, а затем начинают копирование с информацией о ходе выполнения. Однако это может привести к эффектам, которые вы, вероятно, знаете по Windows-машинам, где файловые операции имеют информацию типа «осталось 2 часа», и вдруг через 2 минуты это делается, или наоборот.

Изменить:

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

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

person kap    schedule 07.04.2014

Используя этот пример, выполните команду find вашей основной операционной системы в файле background и отображать результаты в графическом интерфейсе. Поскольку количество файлов заранее неизвестно, программа вызывает setIndeterminate(true) на индикаторе выполнения. Вот несколько типичных командных строк:

ProcessBuilder pb = new ProcessBuilder("find", ".", "-name", "*.txt");
ProcessBuilder pb = new ProcessBuilder("dir", "/s", "*.txt");

изображение

person trashgod    schedule 07.04.2014
comment
Я понял, но как добавить корень в Process Builder, потому что, когда вы находитесь в командной строке, вы на самом деле находитесь в корне, не так ли? - person user3498019; 07.04.2014
comment
Нет, *nix root — это /; не уверен насчёт ДОСа. - person trashgod; 08.04.2014