dave_bulac Ответов: 3

Как найти каталог в компьютере


Поэтому я хочу знать, можно ли найти каталог fullPath только с именем. Например, имя каталога-Dir1. И этот Dir1 находится где-то в ПК, он может быть на диске C или D.

Что я уже пробовал:

Я пытался использовать FileInfo и DirectoryInfo, но для них мне нужен filePath.

ZurdoDev

Да, просто используйте DirectoryInfo. Где ты застрял?

dave_bulac

Смотрите мой комментарий ниже

3 Ответов

Рейтинг:
2

PIEBALDconsult

Есть по крайней мере одно приложение, которое сделает это, если это все, что вам нужно ... everything.en.softonic.com

Вы не говорите, зачем вам это нужно-это одноразовая вещь? Это действительно то, что вы хотите в приложении?

Если вам действительно нужна эта функция в приложении, то DirectoryInfo, вероятно, будет полезен, но вам, вероятно, придется начать с:

Окружающая среда.GetLogicalDrives()
Возвращает массив строк, содержащий имена логических дисков на текущем компьютере.

Окружающая среда.Метод GetLogicalDrives (Система)[^]

И вы, вероятно, захотите использовать какую-то форму рекурсии, но я предлагаю использовать технику, которая позволяет использовать многопоточность (если это необходимо).

И что-то, на что следует обратить внимание, - это возможность того, что в структуре каталогов есть точки повторного анализа, которые создают циклические ссылки, которые заставят ваш метод работать вечно-вам, вероятно, понадобится способ сохранить список каталогов, которые вы уже искали, и всегда проверять перед поиском.


BillWoodruff

+5

dave_bulac

Я использую этот код:
DirectoryInfo dr = новый DirectoryInfo ("CV");
Приставка.WriteLine(dr. FullName);

но в этом он дает такой результат:
c:\users\dave\documents\visual studio 2015\Projects\Exp\Exp\bin\Debug\CV

В случае, если "CV" находится в "локальном диске D", а не в этом каталоге.
Чем я пробовал его для другого каталога, который находится на рабочем столе, но он дает аналогичный результат.

PIEBALDconsult

"Рабочий каталог" вашего приложения - это каталог, содержащий исполняемый файл.
Попробуйте "\ \ CV", но вам нужно будет искать, чтобы найти то, что вы ищете.

dave_bulac

Я ищу каталог "CV", который находится на локальном диске D.

PIEBALDconsult

Вам нужно будет начать с корня и выполнить поиск в дереве каталогов.
Вы можете искать сначала в глубину или в ширину, но вы должны искать; никто не сделает этого за вас.

Рейтинг:
2

NathanRO

Как и все остальные заметили, лучший способ это через запись directoryinfo.GetDirectories(строковый параметр searchpattern, searchoption указывает, нужно searchoption указывает, нужно) метод. Но обязательно а)вручную выполните рекурсию, чтобы избежать неавторизованного исключения Accessexception, и Б) в случае дисков ROM проверьте, готово ли устройство, чтобы избежать ошибки "устройство не готово".

Теперь, чтобы привести пример или найти заданное имя каталога на определенном диске или на всех доступных логических дисках (исключая сетевые диски), пожалуйста, смотрите следующее:

static void Main(string[] args)
{
   DirectoryInfo selectedDir;

   // Find a directory called "Exported" on any available logical drive.
   // If you need to find the directory on a spicific logical drive, provide the DriveInfo for the drive to search.
   selectedDir = FindDirectory("Exported");
   if (selectedDir == null)
   {
      Console.WriteLine("No directory was found matching the provided name.");
   }
   else
   {
      Console.WriteLine("The folloiwng directory path was selected:");
      Console.WriteLine(selectedDir.FullName);
   }
            
   Console.ReadLine();
}

static DirectoryInfo FindDirectory(string dirNameToFind, DriveInfo driveToSearch = null)
{
   // Prevent null strings or searching for invalid directory names (contains invalid charaters).
   if ((String.IsNullOrEmpty(dirNameToFind)) || (!IsValidDirectoryName(dirNameToFind))) { return null; }

   List<directoryinfo> possibleDirs = new List<directoryinfo>();

   if (driveToSearch == null)
   {
      // No drive was specified, so search all drives.
      foreach (DriveInfo availableDrive in DriveInfo.GetDrives())
      {
         // Only check non-network drives and drives with removable media that are ready (disk installed).
         if ((availableDrive.DriveType != DriveType.Network) && (availableDrive.IsReady))
         {
            DirectoryInfo driveRootDir = new DirectoryInfo(availableDrive.Name);
            GetDirectories(possibleDirs, driveRootDir, dirNameToFind);
         }
      }
   }
   else
   {
      // A drive was provided, so only search that drive.
      DirectoryInfo driveRootDir = new DirectoryInfo(driveToSearch.Name);
      GetDirectories(possibleDirs, driveRootDir, dirNameToFind);
   }
            
   if (possibleDirs.Count() == 0) { return null; }  // No dir matches, so return null.
   if (possibleDirs.Count() ==1) { return possibleDirs[0]; } // Only one dir matched, so return that dir.


   // More than one directory exsits matching the provided name. So ask the user to which directory they want.
   Console.WriteLine("Multiple directories were found matching the provided name.");
   Console.WriteLine("Please indicate which directory to use.");
   Console.WriteLine();

   for (int i = 1; i <= possibleDirs.Count(); i++) { Console.WriteLine(i.ToString() + ": " + possibleDirs[i - 1].FullName); }

   Console.WriteLine();

   bool vaidInput = false;
   int selectedItemNo = -1;
   do
   {
      Console.WriteLine("Enter corrisponding number and press enter.");
      string userInput = Console.ReadLine();

      if (String.IsNullOrEmpty(userInput)) { continue; }  // Handle blank entries.

      vaidInput = int.TryParse(userInput, out selectedItemNo);
   }
   while ((!vaidInput) && (Enumerable.Range(1, possibleDirs.Count()).Contains(selectedItemNo)));

   return possibleDirs[selectedItemNo - 1];
}

static bool IsValidDirectoryName(string directoryName)
{
   foreach (char c in Path.GetInvalidPathChars())
   {
      if (directoryName.Contains(c)) { return false; }
   }
   return true;
}

static void GetDirectories(List<directoryinfo> dirList, DirectoryInfo rootDir, string dirNameToFind = null)
{
   // Perform manual recurrsion to prevent "UnauthorizedAccessException" errors.
   try
   {
      foreach (DirectoryInfo subDir in rootDir.GetDirectories("*", SearchOption.TopDirectoryOnly))
      {
         if ((String.IsNullOrEmpty(dirNameToFind)) || (subDir.Name == dirNameToFind)) { dirList.Add(subDir); }
         GetDirectories(dirList, subDir, dirNameToFind);
      }
   }
   catch (UnauthorizedAccessException) {  }    // Do nothing.
}


Рейтинг:
0