Первая очевидная вещь, которая приходит на ум, - это создание отдельного небольшого приложения, которое всегда будет запускаться (возможно, как служба) и создавать своего рода «журнал» изменений в файловой системе (нет необходимости работать с SQLite, просто запишите их в файл). Затем, когда основное приложение запускается, оно может просмотреть журнал и точно знать, что изменилось (не забудьте впоследствии очистить журнал: -).
Однако, если по какой-то причине это неприемлемо для вас, давайте попробуем взглянуть на исходную проблему.
Прежде всего, вы должны согласиться с тем, что в худшем случае, когда все файлы изменились, вам потребуется пройти через все дерево. И это может (хотя и не обязательно) займет много времени. Как только вы поймете это, вы должны подумать о том, чтобы выполнять работу в фоновом режиме, не блокируя приложение.
Во-вторых, если вам нужно принять решение по каждому файлу, который только вы знаете, как сделать, вероятно, нет другого пути, кроме как просмотреть все файлы.
Другими словами, вы могли бы сказать, что проблема по своей сути сложна (и любая конкретная проблема не может быть решена с помощью алгоритма, который проще, чем сама проблема).
Следовательно, ваша единственная надежда - сокращение пространства поиска с помощью твиков и хаков. И у меня есть два из них на уме.
Во-первых, лучше сначала запрашивать базу данных для каждого файла, а не создавать словарь для всех файлов. Если вы создаете индекс для столбца пути к файлу в вашей базе данных, он должен быть быстрее и, конечно, менее ресурсоемким.
Во-вторых, вам вообще не нужно запрашивать базу данных :-)
Просто сохраните точное время, когда ваше приложение в последний раз выполнялось где-то (в файле .settings?), И проверьте каждый файл, чтобы увидеть, не новее ли он того времени. Если это так, вы знаете, что это изменилось. Если это не так, вы знаете, что заметили, что это изменение в последний раз (с помощью FileSystemWatcher).
Надеюсь, это поможет. Веселитесь.