mehrere Verzeichnisse anlegen - Pfad beginnt mit UNC - Problem Directory.Exists

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    mehrere Verzeichnisse anlegen - Pfad beginnt mit UNC - Problem Directory.Exists

    Moin!

    ich möchte mehre Verzeichnisse anlegen und habe mir dafür eine Funktion geschrieben:

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Verzeichnis anlegen mit fehlenden Unterverzeichnissen
    3. ''' </summary>
    4. ''' <param name="Pfad">Pfad</param>
    5. ''' <param name="Log">optional Log-Klasse (default=nothing)</param>
    6. ''' <returns>-1 ... kein Pfad angegeben / 0 ... Fehler / 1 ... erfolgreich</returns>
    7. ''' <remarks></remarks>
    8. Public Function MakeDirectories(ByVal Pfad As String, Optional ByRef Log As EBL.Service.Log = Nothing) As Integer
    9. ' ------ http://ma22-wiki-001/eblwiki/index.php?title=FolderAndFile_(Klasse_von_EBL.Service)#Verzeichnis-Struktur_anlegen ------
    10. Dim Result As Integer = 0
    11. Dim TestPfad As String = "[undef]"
    12. If Pfad.Length = 0 Then
    13. Return -1
    14. End If
    15. Try
    16. If System.IO.Directory.Exists(Pfad) = True Then
    17. Return 1
    18. End If
    19. Dim Folder As String() = Pfad.Split({"\"}, StringSplitOptions.RemoveEmptyEntries)
    20. Dim UNC_Prefix As String = ""
    21. If Pfad.Length > 2 Then
    22. If Pfad.Substring(0, 2) = "\\" Then UNC_Prefix = "\\"
    23. End If
    24. TestPfad = UNC_Prefix & Folder(0)
    25. If System.IO.Directory.Exists(TestPfad) = False Then
    26. Dim Msg As String = "Ungültiges Startlaufwerk:= " & TestPfad
    27. If Pfad.Length > 2 Then Msg += " (mögliches Problem mit UNC-Pfad!)"
    28. If IsNothing(Log) Then
    29. _TryReport.Show(Msg)
    30. Else
    31. Log.WriteAsError(Msg)
    32. End If
    33. Return 0
    34. End If
    35. For i As Integer = 1 To Folder.Count - 1
    36. TestPfad += "\" & Folder(i)
    37. If System.IO.Directory.Exists(TestPfad) = False Then
    38. Try
    39. System.IO.Directory.CreateDirectory(TestPfad)
    40. Catch ex As Exception
    41. Dim Msg As String = "Fehler beim Anlegen eines Verzeichnisses" & "TestPfad:= " & TestPfad
    42. If Not IsNothing(Log) Then
    43. _TryReport.Show(Msg, ex.ToString)
    44. Else
    45. Log.WriteAsError(Msg & vbCrLf & ex.ToString)
    46. End If
    47. Exit For
    48. End Try
    49. End If
    50. Next
    51. 'abschliesssende Prüfung
    52. If System.IO.Directory.Exists(Pfad) = True Then Result = 1
    53. Catch ex As Exception
    54. Dim Msg As String = "unvorhergesehener Fehler in der Funktion EBL.Service > FolderAndFile > MakeDirectories" & vbCrLf &
    55. "Pfad:= " & Pfad & vbCrLf & _
    56. "TestPfad:= " & TestPfad
    57. If Not IsNothing(Log) Then
    58. _TryReport.Show(Msg, ex.ToString)
    59. Else
    60. Log.WriteAsError(Msg & vbCrLf & ex.ToString)
    61. End If
    62. End Try
    63. Return Result
    64. End Function
    65. End Class


    Das Problem beginnt in Zeile 30, wenn der erste Teil des Pfades mit \\srv105 beginnt.

    Directory.Exists sagt dann, dass dieses Laufwerk nicht da ist - stimmt nicht. Den Server gibt es.

    Hat einer von Euch eine "intelligentere" Lösung für mich.

    Es kann nun natürlich auch sein, dass die ersten Ebenen für den Bearbeiter nicht verfügbar sind - dann aber wieder ab Ebene x....

    Bin gespannt - mehr ist mir bisher nicht eingefallen.

    Gruß Jan
    @jan99 Wenn Du mit UNC-Pfaden arbeitest, teste mal die API-Funktion CreateFile().
    msdn.microsoft.com/en-us/libra…op/aa363858(v=vs.85).aspx

    C#-Quellcode

    1. [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    2. private static extern IntPtr CreateFile(
    3. [MarshalAs(UnmanagedType.LPTStr)] string filename,
    4. [MarshalAs(UnmanagedType.U4)] uint access,
    5. [MarshalAs(UnmanagedType.U4)] FileShare share,
    6. IntPtr securityAttributes, // optional SECURITY_ATTRIBUTES struct or IntPtr.Zero
    7. [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
    8. [MarshalAs(UnmanagedType.U4)] uint flagsAndAttributes,
    9. IntPtr templateFile);
    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!