Hallo in die Runde.
Ich bin auf ein für mich seltsames Phänomen gestoßen. Viele Stunden habe ich zwischenzeitlich damit verbracht, um herauszufinden, woher das Problem rührt. Ich weiß mir keinen Rat mehr und hoffe jemand von euch hat einen hilfreichen Gedanken hierzu.
Da mein Script sehr umfangreich geworden ist und die relevanten Teile für das Problem nicht einfach herauskopiert werden können, will ich versuchen, den Sachverhalt so exakt wie möglich zu beschreiben.
Innerhalb des Scripts ruft eine Funktion A eine weitere Funktion B auf. Der erwartete Rückgabewert von B an A soll in Abhängigkeit der in B auszuführenden Schritte entweder ein „“ (leerer String) oder eine Pfadangabe sein. Das funktioniert nach mehreren Testläufen genauso wie gedacht. Nur in einem speziellen Fall (s. u.), wird anstatt des Variableninhalts eine 0 (Null) zurückgegeben. Geprüft habe ich innerhalb von Funktion B:
ConsoleWrite( "$newPath = >" & $newPath & "< Variableninhalt unmittelbar vor Return!!!" & @CRLF ) ; ergibt beispielsweise “D:\Temp”
Return $newPath
Die aufrufende Funktion A erhält jedoch eine 0, obwohl ich D:\Temp erwartet hätte. Ich habe keine Ahnung, woher diese 0 kommt und wie sie sich dazwischen zecken kann, um den korrekten Variablenwert (in dem Beispiel wäre das D:\Temp) zu ersetzen.
Sonderfall, wo dieses Problem auftritt:
In Funktion B wird der Rückgabewert der von hier aufgerufenen Funktion FileSelectFolder() dahingehend überprüft, ob es sich um ein a) Verzeichnis handelt (in diesem konkreten Beispiel sicher redundant) und b) ob der Anwender in diesem Verzeichnis Schreibrechte hat. Beide Prüfungen erfolgen in einer weiteren Funktion C (_validatePathAccessRights() siehe nachstehend), die von Funktion B aufgerufen wird.
Func _validatePathAccessRights( $path )
Local $attributes = FileGetAttrib( $path )
If $attributes <> "" And @error = 0 Then
If StringInStr( $attributes, "D" ) Then
If StringRight( $path, 1 ) = "\" Then $path = StringTrimRight( $path, 1 )
Local $h_tempFile = FileOpen( $path & "\DieseDateiSollteGeloeschtWerden.txt", $FO_OVERWRITE )
If $h_tempFile <> -1 Then ; die erforderlichen Zugriffsrechte sind vorhanden
FileClose( $h_tempFile )
FileDelete( $h_tempFile )
Return True
Else
SetError(3, 0, "Es fehlen die erforderlichen Schreib-Zugriffsrechte.")
FileClose( $h_tempFile )
FileDelete( $h_tempFile )
EndIf
Else
SetError(2, 0, "Bei dem angegebenen Pfad handelt es sich um kein Verzeichnis.")
EndIf
Else
SetError(1, 0, "Es besteht ein grundlegendes Zugriffsproblem auf das Verzeichnis.")
EndIf
Return False
EndFunc ; == > _validatePathAccessRights( $path )
Alles anzeigen
Wahrscheinlich geht das auch eleganter, doch ich bin kein Profi und programmiere hier für private Zwecke.
Zurück zum Problem: Wenn die Validierung ergibt, dass die Schreibrechte für ein Verzeichnis fehlen, dann wird False zurückgegeben, andernfalls True. Das scheint nach meinen bisherigen Tests prima zu funktionieren. Nur nachdem ein False zurückgegeben wurde und anschließend nochmals FileSelectFolder() aufgerufen wird - jetzt jedoch mit einem Verzeichnis als Rückgabewert, für das True bezüglich der Schreibrechte zurückgegeben wird (via ConsoleWrite überprüft) - genau dann passiert das Problem und in der Funktion A kommt die ominöse 0 an. Im übrigen tritt dieses Phänomen auch dann auf, wenn ich die SetError-Zeilen in _validatePathAccessRights() auskommentiere. 🤔
Wird danach das Prozedere erneut durchlaufen und direkt ein Verezichnis ausgewählt, für das der Anwender Schreibrechte hat, dann stimmt der Rückgabewert an die Funktion A. 🙃
Wer hat eine Idee, wie ich das Problem beseitigen kann bzw. in welche Richtung ich schauen muss?
Vielen lieben Dank an allen Mitdenkenden 🙏. Ich wünsche einen Guten Start in das neue Jahr. 🍀