Verzeichnis Namen auslesen!

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Verzeichnis Namen auslesen!

    Moin! :)
    Ich möchte gerne von der Variable Quelle den Ordner auslesen. Also "Neuer Ordner\Neuer Ordner".
    Leider bietet mir IO.Path keine Lösung!
    BIG THX

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim quelle As String = "H:\Neuer Ordner\Neuer Ordner\Bild1.jpg"
    3. Dim ziel As String = "F:\Temp\HierHier"
    4. MsgBox(System.IO.Path.GetFullPath(quelle)) ' Neuer Ordner\Neuer Ordner ?
    5. End Sub
    Visual Basic.NET 8o
    MS-SQL
    8o
    Eine Möglichkeit wäre über FileInfo. Beispiel:

    VB.NET-Quellcode

    1. Dim fullname = "H:\Neuer Ordner\Neuer Ordner\Bild1.jpg"
    2. Dim finfo As New IO.FileInfo(fullname)
    3. Debug.Print($"Verzeichnispfad: {finfo.DirectoryName}")
    4. Debug.Print($"Verzeichnisname: {finfo.Directory.Name}")


    EDIT: Über IO.Path

    VB.NET-Quellcode

    1. ​ Debug.Print($"Verzeichnispfad über IO.Path-Class: {IO.Path.GetDirectoryName(fullname)}")

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xtts02“ ()

    @xtts02
    Danke, aber so weit war ich auch.
    Es kommt raus:
    "H:\Neuer Ordner\Neuer Ordner"
    Mein Ziel wäre es ohne das Laufwerk:
    "Neuer Ordner\Neuer Ordner"
    Nur den Ordnername!

    edit2:
    Problem doch gelöst!
    Vielen Dank!
    Die Lösung:

    VB.NET-Quellcode

    1. MsgBox(System.IO.Path.GetDirectoryName(quelle).Replace(System.IO.Path.GetPathRoot(quelle), ""))

    Visual Basic.NET 8o
    MS-SQL
    8o

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Cheffboss“ ()

    Cheffboss schrieb:

    Mein Ziel wäre es ohne das Laufwerk
    Das musst Du zerlegen:
    fi.Directory.Name
    fi.Directory.Parent.Name
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was soll passieren, wenn jemand einen UNC-Pfad reinschmeißt? Also z.B. \\VBOXSVR\Share\Foo\Bar\Baz.txt. In dem Fall würde bei Dir \Foo\Bar herauskommen (also Share wird auch weggenommen). Ist das OK für Dich?
    Das mit dem Replace funktioniert auch nur zuverlässig, weil ein Doppelpunkt vorkommt, welcher im restlichen Pfad nicht mehr vorkommen darf. Bei einem UNC-Pfad ist kein solcher Doppelpunkt drin. Es kann problemlos so einen Pfad geben: \\VBOXSVR\Share\Foo\Bar\\VBOXSVR\Share\Frob\Flub\Baz.txt Du hattest Glück, dass Du das .Replace nach .GetDirectoryName hast und .GetDirectoryName doppelte Backslashes automatisch entfernt. Hättest Du es zufällig umgedreht, also System.IO.Path.GetDirectoryName(quelle.Replace(System.IO.Path.GetPathRoot(quelle), "")), dann würde nur noch \Foo\Bar\Frob\Flub rauskommen. Also da fehlt ein ganzer Teil. Und ja, doppelte Backslashes sind in Pfaden manchmal erlaubt. Wenn z.B. eine Datei C:\A\B.txt existiert, dann wird sie auch unter C:\A\\B.txt gefunden.
    Oder was soll passieren, wenn jemand einen Linux-ähnlichen Pfad wie /Foo/Bar/Baz.txt eingibt? .GetPathRoot gibt hier / zurück, was ja absolut legitim ist. Dann entfernst Du alle Slashes und es kommt FooBar raus. Das gleiche passiert auch mit Backslashes.

    Pfade als rohen Text zu bearbeiten geht fast immer in die Hose.

    Mein Vorschlag wäre das:

    VB.NET-Quellcode

    1. Public Shared Sub Main(Args As String())
    2. Dim Paths = {"C:\Foo\Bar\Frob\Flub\Baz.txt", "C:\Foo\Bar\Frob\Flub\\Baz.txt", _
    3. "\\VBOXSVR\Share\Foo\Bar\Frob\Flub\Baz.txt", "\\VBOXSVR\Share\Foo\Bar\Frob\Flub\\Baz.txt", _
    4. "/Foo/Bar/Frob/Flub/Baz.txt", "/Foo/Bar/Frob/Flub//Baz.txt", _
    5. "Foo\Bar\Frob\Flub\Baz.txt", "Foo\Bar\Frob\Flub\\Baz.txt", _
    6. "C:\Baz.txt", "C:\\Baz.txt", _
    7. "\\VBOXSVR\Baz.txt", "\\VBOXSVR\\Baz.txt"}
    8. For Each i In Paths
    9. Console.Write("""" & i & """ -> ")
    10. Try
    11. Dim p = GetDirectoryPathWithoutRoot(i)
    12. Console.WriteLine("""" & p & """")
    13. Catch ex As ArgumentException
    14. Console.WriteLine(ex.GetType.Name)
    15. Console.WriteLine(ex.Message)
    16. End Try
    17. Console.WriteLine()
    18. Next
    19. Console.ReadLine()
    20. End Sub
    21. Private Shared Function GetDirectoryPathWithoutRoot(FilePath As String) As String
    22. If String.IsNullOrEmpty(FilePath) Then
    23. Throw New ArgumentNullException("FilePath")
    24. End If
    25. If Not System.IO.Path.IsPathRooted(FilePath) Then
    26. Throw New ArgumentException("FilePath is not rooted.", "FilePath")
    27. End If
    28. Dim File As New System.IO.FileInfo(FilePath)
    29. Dim DirectoryNames As New Stack(Of String)
    30. Dim CurrentDirectory = File.Directory
    31. Do
    32. If CurrentDirectory Is Nothing Then
    33. Exit Do
    34. End If
    35. DirectoryNames.Push(CurrentDirectory.Name)
    36. CurrentDirectory = CurrentDirectory.Parent
    37. Loop
    38. If DirectoryNames.Count = 0 Then
    39. Throw New ArgumentException("FilePath is either an invalid file path or a valid directory path.")
    40. End If
    41. If DirectoryNames.Count = 1 Then
    42. Return String.Empty
    43. End If
    44. Return System.IO.Path.Combine(DirectoryNames.Skip(1).ToArray)
    45. End Function

    Die Funktion holt sich so lange den Parent-Ordner des aktuellen Pfades, bis keiner mehr vorhanden ist. Diese Liste von Ordnern hat dann am Anfang noch den Root-Ordner, welcher übersprungen wird.
    Kleines Manko: Das Ergebnis wird immer mit Backslashes zusammengesetzt, auch wenn der ursprüngliche Pfad Slashes beinhaltet.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils