приветствую. суть вопроса в заголовке. есть приложение которое каждый раз при входе сканирует папку на наличие лишних файлов. лишние это те которые не определены в list. собственно :
private void DeleteFILES(DAL dal)
{
List<string> Equals = new List<string>();
for (int i = 0; i < dal.getMNamesfromBD().Count; i++)
{
Equals.Add(dal.getMNamesfromBD()[i].ToString());
}
try
{
string CompletePatchToEXE = Directory.GetCurrentDirectory();
DirectoryInfo dir = new DirectoryInfo(CompletePatchToEXE + @"\\materials\\");
foreach (FileInfo file in dir.GetFiles())
{
for (int i=0; i<dal.getMNamesfromBD().Count; i++)
{
if (file.Name != Equals[i]+ ".jpg")
{
file.Delete();
}
}
}
MessageBox.Show("Файлы поставленные в очереди были успешно удалены!", "Редактирование");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
однако вместо того что бы удалять файлы не прописанные в Equals код удаляет вообще все файлы. не могу найти ошибку, подскажите где исправить? спасибо!
Код можно сильно упростить, используя LINQ.
Также освойте метод Path.Combine для работы с путями файловой системы.
var materialsDirectory = Path.Combine(Application.StartupPath, "materials");
List<string> Equals = // заполняем список из БД
var distinct = Directory.GetFiles(materialsDirectory)
.Except(Equals.Select(s => Path.Combine(materialsDirectory, s, ".jpg")));
foreach (var fileName in distinct)
new FileInfo(fileName).Delete();
Если я правильно понял, в списке только названия файлов без полного пути и без расширения.
P. S. Судя по другим вашим вопросам, папка materials используется во многих местах кода. Поэтому добавьте поле формы, куда занесите нужный путь один раз при старте приложения, а далее просто используйте его.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей