Получение имени папки из пути


187
string path = "C:/folder1/folder2/file.txt";

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


5
Вы хотите получить последнее имя папки, поэтому, если у вас был C: \ folder1 \ folder2 \ folder3 \ file.txt, вы хотите "folder3"?
Стив Даннер

Ответы:


336

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

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

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

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


134
Другое решение: вернуть новый DirectoryInfo (fullPath) .Name;
Давиде Икарди

1
Решение от Davide Icardi работало лучше для меня, потому что у меня были относительные пути. Спасибо.
Акатран

4
@DavideIcardi Ваш комментарий действительно должен быть ответом, оно того стоит.
Ондрей Яначек

3
Это не работает, когда путь не включает файл (путь к каталогу), в то время как решение @DavideIcardi делает это.
Оге

6
ВНИМАНИЕ: это решение неверно! Для «C: / bin / logs» возвращается «bin». Используйте return new DirectoryInfo (fullPath) .Name; вместо.
Крис Вт

36

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

string filename = @"C:/folder1/folder2/file.txt";
string FolderName = new DirectoryInfo(System.IO.Path.GetDirectoryName(filename)).Name;

23

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

string path = "C:/folder1/folder2/file.txt";
string folder = new DirectoryInfo(path).Name;

3
Папка в этом случае будет file.txt, а неfolder2
TJ Rockefeller

13

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

string my_path = @"C:\Windows\System32";
DirectoryInfo dir_info = new DirectoryInfo(my_path);
string directory = dir_info.Name;  // System32

7

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

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

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

Вывод:

визуальный


Вы можете просто сделать Path.GetFileName (dir), и он вернет имя папки просто отлично.
jrich523

3
var fullPath = @"C:\folder1\folder2\file.txt";
var lastDirectory = Path.GetDirectoryName(fullPath).Split('\\').LastOrDefault();

2

Также важно отметить, что при получении списка имен каталогов в цикле 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

1

Ниже код помогает получить только имя папки

 public ObservableCollection items = new ObservableCollection ();

   пытаться
            {
                string [] folderPaths = Directory.GetDirectories (stemp);
                items.Clear ();
                foreach (строка s в folderPaths)
                {
                    items.Add (new gridItems {foldername = s.Remove (0, s.LastIndexOf ('\\') + 1), folderpath = s});

                }

            }
            поймать (исключение а)
            {

            }
  общедоступный класс gridItems
    {
        public string foldername {get; устанавливать; }
        public string folderpath {get; устанавливать; }
    }

0

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

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;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.