Отримання імені папки з контуру


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

Які об'єкти чи методи я міг би використати, що дасть мені результат folder2?


5
Ви хочете ім'я останньої папки, тому якщо у вас був C: \ folder1 \ folder2 \ folder3 \ file.txt, ви хочете "папка3"?
Стів Даннер

Відповіді:


335

Я, мабуть, використовував щось на кшталт:

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

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

Цей підхід працює незалежно від існування шляху. Цей підхід, однак, покладається на шлях, який спочатку закінчується на ім'я файлу. Якщо невідомо, закінчується шлях на ім'я файлу чи ім'я папки - тоді потрібно перевірити фактичний шлях, щоб побачити, чи існує файл / папка спочатку в місці розташування. У цьому випадку відповідь Дана Дімітру може бути більш доречною.


133
Ще одне рішення: повернути новий DirectoryInfo (fullPath) .Name;
Девід Ікарді

1
Рішення від Девіде Ікарді працювало для мене краще, оскільки я мав відносні шляхи. Дякую.
акатран

4
@DavideIcardi Ваш коментар дійсно повинен бути відповіддю, він того вартий.
Ондрей Яначек

3
Це не працює, якщо шлях не включає файл (шлях до каталогу), тоді як рішення @DavideIcardi робить.
Aage

6
УВАГА: це рішення неправильне! Для "C: / bin / logs" він повертає "bin". Використовуйте повернення нового 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 (реж.), І він поверне ім'я папки добре.
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 = новий ObservableCollection ();

   спробуйте
            {
                string [] folderPaths = Directory.GetDirectories (степп);
                items.Clear ();
                foreach (рядок s у папці Шляхи)
                {
                    items.Add (нова сіткаItems {ім'я папки = s.Remove (0, s.LastIndexOf ('\\') + 1), папка = s});

                }

            }
            вилов (виняток a)
            {

            }
  Сітки громадського класу
    {
        ім'я папки public string {get; набір; }
        відкритий папковий рядок папок {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.