Сравните строковый массив с FileInfo/GetFiles

У меня есть массив string, содержащий все имена "Важные файлы", которые я хочу сохранить в папке. Папка содержит txts, такие как «spam.txt» или подобные, а также 1 файл с именем «vital.txt».

Целью будет перемещение всех остальных файлов, кроме важных, в другую папку.

Вот что я бы сделал:

string[] importantFiles = { "vital.txt", "primordial.dll" };

// with currentDir.GetFiles correctly set
foreach (FileInfo fileScanner in currentDir.GetFiles()) 
{
   foreach (string s in importantFiles)
   {
      // Without the "!", works normally, returns matching files
      if (!fileScanner.Name.Equals(s))
      {
           MessageBox.Show(
             "This is SUPPOSED to be a non matching file : " + fileScanner.Name);
      }
      else // nothing

Проблема, с которой я сталкиваюсь при использовании каждого метода, который я пробовал, заключается в том, чтобы «обратить» процесс сопоставления. Поиск подходящего файла — это нормально, но мне кажется, что отфильтровать плохой файл невозможно.


person Danslebus    schedule 29.12.2018    source источник
comment
Вот пример LINQ: var filesToMove = currentDir.GetFiles().Select(fi => fi.Name).Except(importantFiles).ToList();   -  person vasily.sib    schedule 29.12.2018
comment
Строка не может быть равна всем записям одновременно... поэтому дубликат показывает правильную версию кода, который вы пытались написать в вопросе, и множество вариантов, которые короче в ответах.   -  person Alexei Levenkov    schedule 29.12.2018


Ответы (1)


Давайте переместим все файлы, кроме важных, как вы описали:

using System.IO;

...

// HashSet is better collection than array for your task:
//   1. It's faster on Contains operation: O(1) vs O(N)
//   2. It's more convenient - we can provide a comparer
HashSet<string> importantFiles = new HashSet<string>(StringComparer.OrdinalIgnoreCase) {
  "vital.txt", "primordial.dll" 
};

//TODO: Put the right directory names here
foreach (var file in Directory.GetFiles(@"c:\MyDirectory")) {
  if (!importantFiles.Contains(Path.GetFileName(file)))
    File.Move(file, Path.Combine(@"c:\MyDirectoryForSpam", Path.GetFileName(file)));
}
person Dmitry Bychenko    schedule 29.12.2018
comment
Все работает правильно! Большое спасибо всем за ответ, очень помогает. Я обязательно выучу это наизусть. Хорошего дня ! - person Danslebus; 29.12.2018