Получение имени папки из пути - PullRequest
162 голосов
/ 17 сентября 2010
string path = "C:/folder1/folder2/file.txt";

Какие объекты или методы я мог бы использовать, чтобы получить результат folder2?

Ответы [ 10 ]

294 голосов
/ 17 сентября 2010

Возможно, я бы использовал что-то вроде:

string path = "C:/folder1/folder2/file.txt";
string lastFolderName = Path.GetFileName( Path.GetDirectoryName( path ) );

Внутренний вызов GetDirectoryName вернет полный путь, а внешний вызов GetFileName() вернет последний компонент пути -имя папки.

Этот подход работает независимо от того, существует ли путь на самом деле.Этот подход, однако, опирается на путь, изначально заканчивающийся именем файла.Если неизвестно, заканчивается ли путь в имени файла или имени папки - тогда необходимо проверить фактический путь, чтобы увидеть, существует ли файл / папка в этом месте в первую очередь.В этом случае ответ Дана Димитру может быть более уместным.

28 голосов
/ 18 сентября 2015

Попробуйте это:

string filename = @"C:/folder1/folder2/file.txt";
string FolderName = new DirectoryInfo(System.IO.Path.GetDirectoryName(filename)).Name;
13 голосов
/ 14 августа 2017

Просто и чисто. Использует только System.IO.FileSystem - работает как брелок:

string path = "C:/folder1/folder2/file.txt";
string folder = new DirectoryInfo(path).Name;
7 голосов
/ 02 февраля 2018

DirectoryInfo выполняет работу по удалению имени каталога

string my_path = @"C:\Windows\System32";
DirectoryInfo dir_info = new DirectoryInfo(my_path);
string directory = dir_info.Name;  // System32
6 голосов
/ 25 июня 2013

Я использовал этот фрагмент кода, чтобы получить каталог для пути, если в пути нет имени файла:

например "c: \ tmp \ test \ visual";

string dir = @"c:\tmp\test\visual";
Console.WriteLine(dir.Replace(Path.GetDirectoryName(dir) + Path.DirectorySeparatorChar, ""));

Выход:

визуальный

2 голосов
/ 11 февраля 2016
var fullPath = @"C:\folder1\folder2\file.txt";
var lastDirectory = Path.GetDirectoryName(fullPath).Split('\\').LastOrDefault();
1 голос
/ 28 октября 2015

Код ниже позволяет получить только имя папки


 public ObservableCollection items = new ObservableCollection();

   try
            {
                string[] folderPaths = Directory.GetDirectories(stemp);
                items.Clear();
                foreach (string s in folderPaths)
                {
                    items.Add(new gridItems { foldername = s.Remove(0, s.LastIndexOf('\\') + 1), folderpath = s });

                }

            }
            catch (Exception a)
            {

            }
  public class gridItems
    {
        public string foldername { get; set; }
        public string folderpath { get; set; }
    }
0 голосов
/ 25 июня 2018

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

Например, этот пример кода циклически перебирает список каталогов в любом родительском каталоге при добавлении каждого найденного имени каталога в список строкового типа:

[C #]

string[] parentDirectory = Directory.GetDirectories("/yourpath");
List<string> directories = new List<string>();

foreach (var directory in parentDirectory)
{
    // Notice I've created a DirectoryInfo variable.
    DirectoryInfo dirInfo = new DirectoryInfo(directory);

    // And likewise a name variable for storing the name.
    // If this is not added, only the first directory will
    // be captured in the loop; the rest won't.
    string name = dirInfo.Name;

    // Finally we add the directory name to our defined List.
    directories.Add(name);
}

[VB.NET]

Dim parentDirectory() As String = Directory.GetDirectories("/yourpath")
Dim directories As New List(Of String)()

For Each directory In parentDirectory

    ' Notice I've created a DirectoryInfo variable.
    Dim dirInfo As New DirectoryInfo(directory)

    ' And likewise a name variable for storing the name.
    ' If this is not added, only the first directory will
    ' be captured in the loop; the rest won't.
    Dim name As String = dirInfo.Name

    ' Finally we add the directory name to our defined List.
    directories.Add(name)

Next directory
0 голосов
/ 12 апреля 2016

Это некрасиво, но избегает выделения:

private static string GetFolderName(string path)
{
    var end = -1;
    for (var i = path.Length; --i >= 0;)
    {
        var ch = path[i];
        if (ch == System.IO.Path.DirectorySeparatorChar ||
            ch == System.IO.Path.AltDirectorySeparatorChar ||
            ch == System.IO.Path.VolumeSeparatorChar)
        {
            if (end > 0)
            {
                return path.Substring(i + 1, end - i - 1);
            }

            end = i;
        }
    }

    if (end > 0)
    {
        return path.Substring(0, end);
    }

    return path;
}
0 голосов
/ 25 мая 2013
// For example:
String[] filePaths = Directory.GetFiles(@"C:\Nouveau dossier\Source");
String targetPath = @"C:\Nouveau dossier\Destination";

foreach (String FileD in filePaths) 
{
  try
  {
    FileInfo info = new FileInfo(FileD);
    String lastFolderName = Path.GetFileName(Path.GetDirectoryName(FileD));

    String NewDesFolder = System.IO.Path.Combine(targetPath, lastFolderName);
    if (!System.IO.Directory.Exists(NewDesFolder))
    {
      System.IO.Directory.CreateDirectory(NewDesFolder);
    }
    String destFile = System.IO.Path.Combine(NewDesFolder, info.Name);

    File.Move(FileD, destFile );

    // Try to move
    Console.WriteLine("Moved"); // Success
  }
  catch (IOException ex)
  {
    Console.WriteLine(ex); // Write error
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...