Расчет и кеширование размеров папок - PullRequest
1 голос
/ 28 августа 2011

У меня есть идея для программы на C #, которая работает в основном как Windows Explorer.Цель состоит в том, чтобы отобразить все файлы и папки и показать конкретную информацию для каждого из них.Одна из функций, которые я планирую, состоит в том, чтобы определять размеры папок, которые Explorer не может сделать.

Моя идея алгоритма состоит в том, чтобы накапливать размеры всех файлов в конкретной папке.Тем не менее, я боюсь проблем с производительностью.Например, для отображения размеров всех папок C: я должен рассмотреть все файлы на всем диске.Это, вероятно, займет некоторое время, и, следовательно, вычисление не может быть выполнено каждый раз, когда пользователь переключается на другую папку или обратно.

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

Есть ли какой-нибудь способ узнать, обновлен ли кэш, например, путем получения какой-либо контрольной суммы, которая нене требует расчета всех размеров снова?Есть ли другой эффективный способ памяти и ЦП, чтобы узнать, изменились ли размеры файлов с момента последнего расчета?Или есть еще одна возможность?

Ответы [ 2 ]

1 голос
/ 28 августа 2011

Windows Explorer - довольно хитрая программа. Он полон хитростей, которые предназначены для того, чтобы скрыть тот факт, что любая файловая система слишком медленно повторяется. Виды трюков, о которых я знаю:

  • подделка. Показать иерархию папок в виде дерева и использовать [+] глиф, показывающий, что в папке есть файлы или каталоги. Даже когда это не так. Это видно, создайте пустой каталог и перезагрузите вашу машину. Обратите внимание на [+] глиф, щелкните по нему и обратите внимание, что, когда вынужден перебирать подкаталог, он плавно меняет [+] глиф глифу «ничего нет».

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

  • скажи мне, что случилось. Проводник использует ReadDirectoryChangesW () сильно. Обернутый в .NET классом FileSystemWatcher. Ключевой момент является то, что он получает уведомление, что что-то изменилось в подкаталог, который просматривает пользователь. Не требуется опрос, что будет ужасный перф. Вернитесь к пуле два.

1 голос
/ 28 августа 2011

Windows Explorer имеет доступный размер папки (# файлы, размер на диске и т. Д.), Доступный для свойств любого диска / папки. Пример свойств каталога

Что касается написания программы, вы, безусловно, можете использовать рекурсив DirectoryInfo.EnumerateFiles(), чтобы получить все файлы на диске / в папке.

Что касается мониторингаВы можете использовать класс FileSystemWatcher для отслеживания изменений на любом диске / папке.

Поддерживать актуальность кэша будет сложно, поскольку:

  1. В зависимости отФорматированный тип раздела [Fat, Fat32, NTFS и т. Д.] Вы ограничены тем, что поддерживает каждый из них.
  2. Любой новый файл (дата создания> дата кэширования) означает, что вам все равно придется перечислить все файлы, чтобы отфильтровать список вновые файлы.
  3. Измененные файлы (дата изменения> дата кэша) имеют ту же проблему.

Если вы не используете что-то ОЧЕНЬ специфичное для форматированного типа, помимо того, что предоставляет C #, обновление кешапосле запуска приложения нужно будет каждый раз происходить и быть очень интенсивным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...