Получение полного пути к файлам, когда у вас есть только часть имени файла, хранящегося в строке [ ]

#c#

#c#

Вопрос:

Я сохранил в «Строке []» идентификатор файлов, которые мне нужно переместить в другую папку.

У всех файлов разные префиксы, и есть сотни файлов.

Все файлы имеют разные префиксы

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

В чем проблема?

Я не могу получить полный путь к файлу, используя только часть имен файлов. Любая помощь была бы высоко оценена.

         string ID = File.ReadAllText(@"C:UsersDesktopScriptzig.txt");
        Console.WriteLine(ID);
        Console.ReadLine();


        String root = @"C:UsersDesktopScripttiptop";
        String[] lines = System.IO.File.ReadAllLines(@"C:UsersDesktopScriptzig.txt");

        for (int i = 0; i <= lines.Length; i  )
        {
            string fullPath = System.IO.Path.Combine(root,(lines[i-1]));

            if (System.IO.File.Exists(fullPath))
            {
                Console.WriteLine(""   fullPath);
            }

        }

        for (int i = 0; i <= lines.Length;i  )
        {
            //Console.WriteLine(""   lines[i]);
            string fullPath = Path.GetFullPath(@"C:UsersDesktopScripttiptop");

            Console.WriteLine(System.IO.Directory.EnumerateFiles(@"C:UsersDesktopScripttiptop", lines[i]));
  

Комментарии:

1. Почему бы и нет? если у вас есть только 3 места, вы ищете их, просматриваете файлы, проверяете каждое место .. тада?

2. Вы имеете в виду поиск всех файлов с «идентификатором»? Попробуйте использовать подстановочный знак и перебрать возможные каталоги для сопоставления файлов

Ответ №1:

Мы можем сканировать файлы и сопоставлять их с Ids с помощью Linq:

   // HashSet<string> is faster for Contains then string[]: O(1) vs. O(N)
  HashSet<string> Ids = new HashSet<string>() {
    "011911772",
    "123456789",
  };

  string[] dirsToScan = new string[] {
    @"c:Utilisateurs",
    @"d:MyFiles",
    @"c:SomeOtherDirSomeFolder",
  };

  var regex = new Regex("[0-9] $"); 

  //TODO: check search options (and restrict if possible)
  var files = dirsToScan
    .SelectMany(dir => Directory.EnumerateFiles(dir, "*.*", SearchOption.AllDirectories))
    .Where(file => {
      var match = regex.Match(Path.GetFileNameWithoutExtension(file));

      return match.Success amp;amp; Ids.Contains(match.Value);
    })
    .ToArray(); // Let's materialize as an array