• Wie handhabt ihr die Prüfung, ob ein bestimmtes Verzeichnis existiert?

    FileExists ist klar. Aber gibts mittlerweile auch ein DirExists?

    Es soll überprüft werden, ob ein (Backup-)Verzeichnis existiert. Grundsätzlich geht das ja mit FileExists, was aber ein False-Positive ergeben kann, wenn statt des gesuchten Dirs eine Datei mit dem Namen dort liegt. Im INet wird z. B. hier darüber diskutiert, und eine mögliche Lösung wird hier gezeigt.

    Python
    $folder="C:\Testing\bak"
    IF FileExists($folder) and StringInStr(FileGetAttrib($folder),"D") Then MsgBox(0,"Folder Found","The folder " & $folder & " exists")

    Funktioniert das, oder geht es auch galanter?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Bei meinen Tests hat sich gezeigt, dass FileExists zwar funktioniert, wenn man den Pfad mit Backslash abschließt. Leider wird der Pfad aber nicht immer mit Backslash übergeben, z. B. von Funktionen oder Macros.

    Die Methode mit FileGetAttrib schein ganz ordentlich zu funktionieren, oder gibts da auch einen Haken? Und nur zut Sicherheit: Es gibt doch keine Ordner ohne D-Attribut, oder? :/

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Ich verwende immer folgende Hilfsfunktion, also i.W. das, was Du bereits gefunden hast :

    Python
    Func _DirectoryExists($sDirPath)
        Return FileExists($sDirPath) And StringInStr(FileGetAttrib($sDirPath), 'D')
    EndFunc ;==>_DirectoryExists

    Haken gibt es, soweit ich weiß, keine. Ob der Pfad mit oder ohne \ am Ende angegeben wird ist egal.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Return FileExists($sDirPath) And StringInStr(FileGetAttrib($sDirPath), 'D')

    Du bist ein Bayer - Hosenträger und Gürtel, weil einem allein kann man ja nicht trauen! 8o

    Return StringInStr(FileGetAttrib($sDirPath), 'D')

    ..reicht doch völlig aus, oder bin ich noch nicht ganz wach?

    Code
    Global $sDirPath = 'f:\Audio\MP3\International\L\Lana Del Rey'
    ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   _DirectoryExists('"&$sDirPath&"') --> " & _DirectoryExists($sDirPath) & @LF & "!@ " & @TAB & "#Error: " & @error & @LF)
    
    Func _DirectoryExists($sDirPath)
        Local $sAttribs = FileGetAttrib($sDirPath)
        Return SetError($sAttribs = '' ? 1 : 0, 0, StringInStr($sAttribs, 'D') = True)
    EndFunc ;==>_DirectoryExists

    2 Mal editiert, zuletzt von Bitnugger (11. August 2019 um 09:21)

  • Return StringInStr(FileGetAttrib($sDirPath), 'D')

    ..reicht doch völlig aus, oder bin ich noch nicht ganz wach?

    Ja, Return StringInStr(FileGetAttrib($sDirPath), 'D') tut es auch.

    "Meine" Variante gibt True/False zurück, "Deine (alte)" 1/0.

    Würde man den Rückgabewert mit IsBool prüfen, dann wäre "Deiner" nicht vom Typ Boolean. Das ist aber alles Haarspalterei und irrelevant im vorliegenden Anwendungsfall. Man könnte sicher auch eine Schreibweise mittels ternärem Operator, als Regulären Ausdruck oder über irgendeine WinAPI Spielerei finden.

    EDIT :

    Ah, wie ich sehe hast Du den ternären Operator bereits bemüht ;). Der Rückgabewert ist nun auch vom Typ Boolean.

    Überlassen wir es einfach dem User welche Variante ihm besser gefällt, bzw. welche er besser versteht.

    Nebenbei : Auf Lederhosen stehe ich gar nicht :P

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Return StringInStr(FileGetAttrib($sDirPath), 'D')

    ..reicht doch völlig aus, oder bin ich noch nicht ganz wach?

    Interessante Sache! ... In fast allen Codes, die ich im INet gefunden habe (bis zurück ins Jahr 2005 von Jos), wurde zuerst FileExists genannt, dann über die False-Positive Problemantik diskutiert und am Ende die Doppel-Sicherung mit Gürtel und Hosenträger genannt.

    Return FileExists($sDirPath) And StringInStr(FileGetAttrib($sDirPath), 'D')

    Scheinbar hatte da niemand weiter drüber nachgedacht, bis heute. ... Dann kam Bitnugger! ;)

    Nach euren Postings hier habe ich einige Tests durchgeführt und für mich wichtige Erkenntnisse erlangt. Das StringInStr(...) sollte tatsächlich ausreichen, allerdings kann die Rückgabe nicht nur 0 und 1, sondern z. B. auch "3" sein, je nachdem wieviele Attribute gesetzt sind. Bei einer Auswertung mit "If" wird mit einer implizieten Typumwandlung ausgewertet, so dass alles was nicht 0 ist, True ergibt und somit funktioniert. Ich bevorzuge jedoch ein Ergebnis, das möglichst schon als bool vorliegt. Das finde ich sauberer, ist aber Geschmackssache.

    Die Lösung Return SetError($sAttribs = '' ? 1 : 0, 0, StringInStr($sAttribs, 'D') = True) ist mir zu unübersichtlich, vielleicht ein wenig overheaded.

    Derzeit schwebt mir folgende Vereinfachung vor:

    Return StringInStr(FileGetAttrib($sPath), "D") = True

    Das ist kurz und liefert ein boolsches Ergebnis.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    • Offizieller Beitrag

    Gibt ja noch das FileSystemObject:

    Python
    Global $sPathWin = @WindowsDir
    Global $sPathNotExists = 'C:\Fantasy'
    
    ConsoleWrite('_DirExists($sPathWin)       ' & _DirExists($sPathWin) & @CRLF)
    ConsoleWrite('_DirExists($sPathNotExists) ' & _DirExists($sPathNotExists) & @CRLF)
    
    Func _DirExists($_sDir)
        Local Static $oFileSystem = ObjCreate('Scripting.FileSystemObject')
        Return $oFileSystem.FolderExists($_sDir)
    EndFunc

    Edit:

    Noch eine Variante

    Python
    Func _DirExists($_sDir)
        Local $aRet = DllCall('shlwapi.dll', 'bool', 'PathIsDirectoryW', 'wstr', $_sDir)
        Return ($aRet[0] > 0 ? True : False)
    EndFunc
  • Bei meinen Tests hat sich gezeigt, dass FileExists zwar funktioniert, wenn man den Pfad mit Backslash abschließt. Leider wird der Pfad aber nicht immer mit Backslash übergeben, z. B. von Funktionen oder Macros.

    Warum dann die Funktion _DirExists nicht so schreiben, dass sie auf den abschließenden Backslash prüft und ihn bei Bedarf hinzufügt?
    Beispiel:

    Code
    Func _DirExists($sDirPath)
        If StringRight($sDirPath, 1) <> "\" Then $sDirPath &= "\"
        Return (FileExists($sDirPath) = 1) ? True : False
    EndFunc