Выглядит хорошо, но вы можете сделать это проще:
foreach (var file in allFiles.Except(dbFiles))
{
File.Delete(file);
}
Вы должны убедиться, что пути в точно , хотя и в том же формате.Если в одном списке есть относительные файлы, а в другом - абсолютные файлы, или если в одном используется «/», а в другом - «\», вы в конечном итоге удалите то, чего не ожидаете.
В идеале вы »Сначала я явно канонизирую файлы, но я не вижу хорошего способа получить каноническое имя файла в .NET ...
РЕДАКТИРОВАТЬ: обратите внимание, что Path.GetFullPath
делает не канонизировать,Он исправляет косые черты и делает его абсолютным, но не учитывает регистр: «c: / users» становится «c: \ users», а «c: / Users» становится «c: \ Users».
Это может быть исправлено с помощью сравнения строк в вызове Except
:
var dbFiles = db.AllPaths().Select(Path.GetFullPath));
var allFiles = Directory.EnumerateFiles(path).Select(Path.GetFullPath));
foreach (var file in allFiles.Except(dbFiles, StringComparer.OrdinalIgnoreCase))
{
File.Delete(file);
}
Теперь это игнорирует регистр - но в «порядковом» порядке.Я не знаю, что на самом деле делает файловая система Windows с точки зрения чувствительности к регистру.