Помогите с написанием LINQ запроса

Суть такова: есть папки в которых есть файлы, после манипуляций с ними путь к этим файлам записывается в БД (т.е в дальнейшем мне с ними никак взаимодействовать не надо). Мне надо проверить, есть ли уже в БД файлы, которые есть в конкретной директории. Я пытался вот так:

var except = concreteDirFiles.Except(allDbFiles);

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

У меня стоит System.Timers.Timer и проверяет все папки на наличие новых файлов, в результате для папки mydir1 я получу массив string[2], однако, если эти файлы уже есть в БД (допустим БД вернет мне массив string[5]), то код выше просто исключит их текущего контекста LINQ и вернет мне файлы из БД (с удаленным вхождением string[2], получается, что код Except возвращает мне string[3]), которые потом другой код будет обрабатывать и так до бесконечности будет исключать вхождение, но возвращать по сути уже обработанные файлы.

Как правильно написать LINQ, чтобы пропускать уже существующие в бд файлы?

Используется EF Core 5.0.10.


Ответы (1 шт):

Автор решения: Blackmeser

Если ваш "директор" ставит задачу слежения за файлами, дабы знать когда какой файл изменился, чтобы определить источник изменения - есть такая штука в Windows, как аудит:
ПКМ на диск/папку/файл -> свойства -> безопасность -> дополнительно -> аудит -> изменить -> добавить -> Пишите "Все" -> ОК -> можете проставить все галочки (хотя хватит и трансфер/создание/удаление) -> И снова ОК -> ОК .. ОК

Потом глобально включаете аудит: В cmd команда "secpol" -> локальные политики -> политика аудита -> аудит доступа к объектам -> ставите галочки (или только одну на успех) -> применить

Запускаете журнал событий:
В cmd eventvwr -> журналы windows -> безопасность -> создать настраиваемое представление -> выставляете параметры:

Журналы событий - безопасность
Источники - Microsoft Windows security auditing.
Ключевые слова - Аудит отказа, Аудит успеха
Если компьютер в домене или есть доступ - можно указать сетевой 
 адрес компьютера на котором находятся файлы и выполняется аудит.

Сохраняете настраиваемое представление с новым именем - всё, теперь сама ОС следит за изменениями конкретных объектов без всяких сканирований сторонним софтом.
Единственное условие - всё это настраивать нужно на том компьютере - где физически находятся файлы, а смотреть уже можно с любого компа (в настраиваемом представлении указать адрес компа, с ходу может не получиться, т.к. безопасность винды, домены, рабочие группы, учётные записи, итд...).

Чтобы убрать отслеживание, так-же через свойства объекта: ПКМ -> свойства -> безопасность -> дополнительно -> аудит -> изменить -> удаляете правило.

https://docs.microsoft.com/ru-ru/microsoft-365/compliance/export-view-audit-log-records?view=o365-worldwide В статье описано как экспортировать данный журнал и открыть его в Excel. Можно написать батник и засунуть в планировщик чтобы он запускал экспорт и писал файл в отдельную папку, из которой уже читать всё это какой-нибудь утилитой, может даже вашей самописной, в принципе хоть в БД напрямую экспортируй, MSSQL точно такое поддерживает, главное чтобы таблица была, многие другие БД тоже на такое способны.

Если не нужно писать в БД (его роль уже будет играть журнал винды), то в .NET уже есть System.Diagnostics.EventLog, им и можете читать. Прибиндить вывод к формам или wpf за пару кликов - труда не составит.

В итоге хочу сказать: если это нужно для внутренних нужд организации, то лучше использовать уже готовые инструменты, любезно предоставленные самими мелкомягкими, конкретно для данной задачи, данный метод точно работает в Windows 7 - сам пользуюсь, должен работать начиная с Windows server 2003, и может уже и был в Windows XP или ещё раньше, т.к. вопрос информационной безопасности стоял уже очень давно в зарубежных компаниях. Поэтому зачем изобретать велосипед, когда можно настроить уже существующий вылизанный инструмент, которому лет 20. Единственный вопрос: как удобно показать эти данные (binding: forms-datagridview / wpf, да хоть в браузере), если нужно не только в журналах - export в БД через xml или System.Diagnostics.EventLog с реалтайм докидыванием записей в БД, а если приложение было остановлено - дополнительная таблица с последних записанным моментом времени чтобы читать историю System.Diagnostics.EventLog при запуске и фильтровать её. Это лучше чем долбаться с файлами и папками и жарить мозги в попытках продумать алгоритм чтобы узнать что изменилось когда программа была выключена.

→ Ссылка