Pobieranie nazwy folderu ze ścieżki

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

Jakich obiektów lub metod mógłbym użyć, aby dać mi wynik folder2?

Ash Burlaczenko
źródło
5
Czy chcesz nazwę ostatniego folderu, więc jeśli miałeś C: \ folder1 \ folder2 \ folder3 \ file.txt, chcesz „folder3”?
Steve Danner,

Odpowiedzi:

335

Prawdopodobnie użyłbym czegoś takiego:

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

Wewnętrzne wywołanie do GetDirectoryNamezwróci pełną ścieżkę, a zewnętrzne wywołanie do GetFileName()zwróci ostatni składnik ścieżki - która będzie nazwą folderu.

To podejście działa niezależnie od tego, czy ścieżka rzeczywiście istnieje. Takie podejście opiera się jednak na ścieżce początkowo kończącej się nazwą pliku. Jeśli nie wiadomo, czy ścieżka kończy się nazwą pliku lub folderu - wymaga to sprawdzenia rzeczywistej ścieżki, aby sprawdzić, czy plik / folder istnieje najpierw w lokalizacji. W takim przypadku odpowiedź Dana Dimitru może być bardziej odpowiednia.

LBushkin
źródło
133
Inne rozwiązanie: zwróć nowy DirectoryInfo (fullPath) .Name;
Davide Icardi
1
Rozwiązanie Davide Icardi działało dla mnie lepiej, ponieważ miałem względne ścieżki. Dzięki.
akatran
4
@DavideIcardi Twój komentarz naprawdę powinien być odpowiedzią, warto.
Ondrej Janacek,
3
To nie działa, gdy ścieżka nie zawiera pliku (ścieżki do katalogu), podczas gdy rozwiązanie @DavideIcardi.
Aage
6
UWAGA: to rozwiązanie jest złe! Dla „C: / bin / logs” zwraca „bin”. Użyj return new DirectoryInfo (fullPath) .Name; zamiast.
Chris W
36

Spróbuj tego:

string filename = @"C:/folder1/folder2/file.txt";
string FolderName = new DirectoryInfo(System.IO.Path.GetDirectoryName(filename)).Name;
Wahju
źródło
23

Prosty i czysty. Używa tylko System.IO.FileSystem- działa jak urok:

string path = "C:/folder1/folder2/file.txt";
string folder = new DirectoryInfo(path).Name;
susieloo_
źródło
3
folder w tym przypadku byłby file.txt, a niefolder2
TJ Rockefeller
13

DirectoryInfo wykonuje zadanie usunięcia nazwy katalogu

string my_path = @"C:\Windows\System32";
DirectoryInfo dir_info = new DirectoryInfo(my_path);
string directory = dir_info.Name;  // System32
Sayka
źródło
7

Użyłem tego fragmentu kodu, aby uzyskać katalog ścieżki, gdy nazwa pliku nie zawiera ścieżki:

na przykład „c: \ tmp \ test \ visual”;

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

Wynik:

wizualny

Mario
źródło
Możesz po prostu zrobić Path.GetFileName (reż), a zwróci nazwę folderu.
jrich523
3
var fullPath = @"C:\folder1\folder2\file.txt";
var lastDirectory = Path.GetDirectoryName(fullPath).Split('\\').LastOrDefault();
Shawn
źródło
2

Ważne jest również, aby pamiętać, że podczas pobierania listy nazw katalogów w pętli DirectoryInfoklasa jest inicjalizowana raz, co pozwala tylko na pierwsze wywołanie. Aby ominąć to ograniczenie, upewnij się, że używasz zmiennych w swojej pętli do przechowywania nazw poszczególnych katalogów.

Na przykład ten przykładowy kod zapętla listę katalogów w dowolnym katalogu nadrzędnym, dodając jednocześnie każdy znaleziony katalog do nazwy wewnątrz listy ciągów znaków:

[DO#]

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
Willy Kimura
źródło
1

Poniższy kod pomaga uzyskać tylko nazwę folderu

 public ObservableCollection items = new ObservableCollection ();

   próbować
            {
                string [] folderPaths = Directory.GetDirectories (stemp);
                items.Clear ();
                foreach (łańcuchy s w folderze Paths)
                {
                    items.Add (new gridItems {foldername = s.Remove (0, s.LastIndexOf ('\\') + 1), folderpath = s});

                }

            }
            catch (wyjątek a)
            {

            }
  klasa publiczna gridItems
    {
        nazwa publiczna ciąg foldername {get; zestaw; }
        public string folderpath {get; zestaw; }
    }
Joee
źródło
0

Jest to brzydkie, ale unika alokacji:

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;
}
Johan Larsson
źródło