Abrufen des Ordnernamens von einem Pfad

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

Aus welchen Objekten oder Methoden könnte ich ein Ergebnis erzielen folder2?

Ash Burlaczenko
quelle
5
Möchten Sie den letzten Ordnernamen? Wenn Sie also C: \ Ordner1 \ Ordner2 \ Ordner3 \ Datei.txt hatten, möchten Sie "Ordner3"?
Steve Danner

Antworten:

333

Ich würde wahrscheinlich so etwas verwenden wie:

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

Der innere Aufruf von GetDirectoryNamegibt den vollständigen Pfad zurück, während der äußere Aufruf von GetFileName()die letzte Pfadkomponente zurückgibt - den Ordnernamen.

Dieser Ansatz funktioniert unabhängig davon, ob der Pfad tatsächlich vorhanden ist oder nicht. Dieser Ansatz basiert jedoch auf dem Pfad, der anfänglich mit einem Dateinamen endet. Wenn nicht bekannt ist, ob der Pfad mit einem Dateinamen oder einem Ordnernamen endet, müssen Sie zuerst den tatsächlichen Pfad überprüfen, um festzustellen, ob eine Datei / ein Ordner am Speicherort vorhanden ist. In diesem Fall könnte die Antwort von Dan Dimitru angemessener sein.

LBushkin
quelle
133
Eine andere Lösung: Geben Sie new DirectoryInfo (fullPath) .Name zurück.
Davide Icardi
1
Die Lösung von Davide Icardi funktionierte besser für mich, weil ich relative Wege hatte. Vielen Dank.
Akatran
4
@ DavidIcardi Dein Kommentar sollte wirklich eine Antwort sein, es lohnt sich.
Ondrej Janacek
3
Dies funktioniert nicht, wenn der Pfad keine Datei enthält (einen Pfad zu einem Verzeichnis), während dies bei der @ DaveIcardi-Lösung der Fall ist.
Aage
6
WARNUNG: Diese Lösung ist falsch! Für "C: / bin / logs" wird "bin" zurückgegeben. Verwenden Sie return new DirectoryInfo (fullPath) .Name; stattdessen.
Zbigniew Wiadro
36

Versuche dies:

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

Einfach und sauber. Nur verwendet System.IO.FileSystem- funktioniert wie ein Zauber:

string path = "C:/folder1/folder2/file.txt";
string folder = new DirectoryInfo(path).Name;
susieloo_
quelle
3
Ordner in diesem Fall wäre file.txtund nichtfolder2
TJ Rockefeller
13

DirectoryInfo erledigt den Job, um den Verzeichnisnamen zu entfernen

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

Ich habe dieses Code-Snippet verwendet, um das Verzeichnis für einen Pfad abzurufen, wenn sich kein Dateiname im Pfad befindet:

zum Beispiel "c: \ tmp \ test \ visual";

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

Ausgabe:

visuell

Mario
quelle
Sie können einfach Path.GetFileName (dir) ausführen und der Ordnername wird einwandfrei zurückgegeben.
jrich523
3
var fullPath = @"C:\folder1\folder2\file.txt";
var lastDirectory = Path.GetDirectoryName(fullPath).Split('\\').LastOrDefault();
Shawn
quelle
2

Es ist auch wichtig zu beachten, dass beim Abrufen einer Liste von Verzeichnisnamen in einer Schleife die DirectoryInfoKlasse einmal initialisiert wird, sodass nur ein erstmaliger Aufruf möglich ist. Um diese Einschränkung zu umgehen, stellen Sie sicher, dass Sie Variablen in Ihrer Schleife verwenden, um den Namen eines einzelnen Verzeichnisses zu speichern.

Dieser Beispielcode durchläuft beispielsweise eine Liste von Verzeichnissen in einem übergeordneten Verzeichnis, während jeder gefundene Verzeichnisname in einer Liste mit dem Zeichenfolgentyp hinzugefügt wird:

[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
Willy Kimura
quelle
1

Der folgende Code hilft, nur den Ordnernamen abzurufen

 public ObservableCollection items = new ObservableCollection ();

   Versuchen
            {
                string [] folderPaths = Directory.GetDirectories (stemp);
                items.Clear ();
                foreach (Zeichenfolge s in folderPaths)
                {
                    items.Add (new gridItems {Ordnername = s.Remove (0, s.LastIndexOf ('\\') + 1), Ordnerpfad = s});

                }}

            }}
            fangen (Ausnahme a)
            {

            }}
  public class gridItems
    {
        öffentlicher String-Ordnername {get; einstellen; }}
        öffentlicher String-Ordnerpfad {get; einstellen; }}
    }}
Joee
quelle
0

Dies ist hässlich, vermeidet jedoch Zuweisungen:

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
quelle