UDF _FolderIsWriteable

  • Hallo,

    nachdem ich diese Funktion immer wieder bei mir intern gebraucht habe, habe ich mir gedacht, diese als UDF mal hochzuladen.

    Die Funktion funktioniert folgendermaßen: man will einen Ordner auf Beschreibbarkeit prüfen. Dabei wird eine versteckte Datei in dem Ordner, der als Parameter übergeben wurde, erstellt. Wenn diese nicht existiert, ist der Ordner logischerweise nicht beschreibbar. Sonst schon. (Existiert der Ordner nicht, wird zusätzlich als ErrorCode noch 1 rausgehauen und 0 zurückgegeben, wie wenn der Ordner nicht beschreibbar ist. Sonst ist der Rückgabewert bei Beschreibbarkeit 1).

    Anbei der Code:

    Diese Funktion ist für jegliche Integration in freie oder kommerzielle Software freigegeben.

    MfG Olfibits :)

    neben AutoIt jetzt auch noch in C/C++, Java und Python aktiv :)
    Stand 04.04.2018, 13:34

    Einmal editiert, zuletzt von olfibits (2. Juli 2017 um 14:56) aus folgendem Grund: Tippfehler in der UDF

  • Warum nutzt du nicht FileGetAttrib zum prüfen? Das funktioniert auch für Ordner wie du es aus der Hilfe entnehmen kannst.

    Außerdem ist der Rückgabewert so nicht richtig, ich kann mit FileWrite in das Verzeichnis schreiben auch wenn ich eine 0 zurückbekomme (klappt auch bei FilGetAttrib trotz R-only).
    Übrigens ist FileWriteLine(".", $path) kein gültiger Aufruf, da der Dateiname gefordert ist, so würdest du nur das working-directory auswählen und eine Datei ohne Namen.
    Das müsste dann in jedem Fall eine 0 zurückgeben, richtig wäre FileWriteLine($path, "content").

    Dann brauchst du auch nicht mehr die Datei zu verstecken, weil diese doch sowieso direkt gelöscht wird im Skript.

    SetError(1) ; invalid parameter 1
    Return 0

    Das kannst du übrigens in Return SetError(1, 0, 0) zusammenfassen, nur als kleiner Tipp.

  • Danke für den SetError-Tipp, aber...

    Schau mal oben, wie ich $path deklariert habe. :)

    neben AutoIt jetzt auch noch in C/C++, Java und Python aktiv :)
    Stand 04.04.2018, 13:34

  • Schau mal oben, wie ich $path deklariert habe.

    Du schreibst aber in das Working-Directory ohne ein Datei anzugeben. Lass dir doch mal den Returnwert von FileWriteLine ausgeben, da kommt immer 0 raus.
    FileWriteLine ( "filehandle/filename", "line" ) FileWriteLine will als ersten Parameter den Dateinamen haben, und mit "." übergibst du das nicht, sondern nur das Working Directory.

    Führe doch mal folgende Zeile aus in einem leeren AutoIt-Skript: FileWriteLine(".\testFile.txt", "123") und du wirst merken, dass er in das Working-Directory die testFile.txt erzeugt.
    Führst du allerdings diese Zeile aus FileWriteLine(".", @ScriptDir & "\testFile.txt"), dann siehst du das keine Datei erzeugt wird. Dein Funktionsaufruf ist also falsch.

  • Ach so meinst du das... Oh nein, ich hab ja die Parameter vertauscht :Face: (der Punkt sollte nur ein "platzhalter" sein, weil ich nicht wusste, ob die Datei dann überhaupt erstellt wird...)

    neben AutoIt jetzt auch noch in C/C++, Java und Python aktiv :)
    Stand 04.04.2018, 13:34

  • Hallo @olfibits,

    das ist jetzt natürlich ein blöder Kommentar, weil ich etwas kritisiere, das du gemacht hast. Aber eigentlich ist es keine Kritik an deiner Funktion, die man gerne so machen kann, wie du es getan hast.

    Jedoch genügt es, wie alpines es ja auch schon erwähnte, FileGetAttrib zu erfragen oder und das ist in der Praxis sicher noch schneller, FileOpen auf Fehler zu prüfen.

    Aus meiner Sicht gehört es zu gutem Programmierstil auf Fehler zu prüfen. FileOpen .. If @error kosten nicht mehr Zeilen, als dein Funktionsaufruf, führen aber zum gleichen Ergebnis.

    (Ich schrieb das, weil ich bei mir das Problem sehe, dass ich zu wenig auf Fehler prüfe. Ich will schnell von a nach b und nur die nötigsten Zeilen schreiben. Das führt dann häufig zu Problemen, die ich hätte vermeiden können, wenn ich einfach die allgemeinen Regeln befolgt hätte, statt sie in den Wind zu schlagen, weil das Programm bei meinen Tests nicht abgestürzt ist..).

    Grüße autoiter

  • Dass ich die Funktion anstatt FileGetAttrib() verwende, hat den Grund, dass FileGetAttrib() - zumindest in meinem Fall - Ordnerfreigaben und v.a. Verzeichnisse in CD-Laufwerken (wo die Funktion sogar Fehler lieferte) nicht berücksichtigt hatte. Da ich u.a. auch Software auf CDs ausliefere, wollte ich so auf Nummer sicher gehen.

    neben AutoIt jetzt auch noch in C/C++, Java und Python aktiv :)
    Stand 04.04.2018, 13:34

    • Offizieller Beitrag

    Das mit den Verzeichnissen auf CD stimmt ja sogar! Das war mir gar nicht bewusst (habe ich bisher nicht gebraucht).
    Aber Du solltest in Deiner Funktion auch testen, ob der übergebene Pfad auch wirklich ein Verzeichnis ist, ansonsten wird u.U. sowas ("C:\folder\datei.txt\isWriteable.tmp') erstellt.
    Außerdem brauchst Du nicht wirklich etwas in die temporäre Datei speichern. Wenn FileOpen fehlschlägt, dann schreibgeschützt, ansonsten beschreibbar.
    Das könnte man dann auf wenige Zeilen kürzen:

  • Oha, das mit dem Parameter als Datei war mir gar nicht bewusst :)
    OK danke, werde das morgen mal abändern und bearbeiten.

    neben AutoIt jetzt auch noch in C/C++, Java und Python aktiv :)
    Stand 04.04.2018, 13:34

  • Eine Alternative wäre noch: