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

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()вернет последний компонент пути, который будет именем папки.

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

LBushkin
источник
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;
Wahyu
источник
23

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

string path = "C:/folder1/folder2/file.txt";
string folder = new DirectoryInfo(path).Name;
susieloo_
источник
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
Sayka
источник
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; устанавливать; }
    }
Joee
источник
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;
}
Йохан Ларссон
источник