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?


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.


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;

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;

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

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


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();

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

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; }
    }

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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.