Hey Leute,
ich durchsuche per FTP in einem Programm, das ich weitergebe, vom Linux-Receiver gemountete Verzeichnisse nach Filmen, Bildern und XML-Dateien.
Hierbei können die Receiver auf eingebaute Festplatten, USB-Platten und NAS-Laufwerke zugreifen, die unter Umständen erst geweckt werden müssen.
Im Grunde funktioniert das soweit. Jedoch höre ich immer mal wieder auch, dass es ewig lange dauern würde, bis alle Daten vorhanden sind.
Ich durchsuche schon nur zwei Ebenen, damit es nicht zu lange dauert. Aber ich denke, ich mache es prinzipiell wahrscheinlich schlecht. Daher möchte ich euch mal bitten, mir eure kritische Beurteilung meiner rekursiven Suche mitzuteilen.
Über eure Hinweise freue ich mich
Spoiler anzeigen
Local $Open = _FTP_Open("MyFTP Control")
Local $Callback = _FTP_SetStatusCallback($Open, "FTPStatusCallbackHandler")
If Not ($sActiveFTP = 1) Then
Local $conn = _FTP_Connect($Open, $IP, $ftpUser, $ftpPass, 0, $ftpPort, $INTERNET_SERVICE_FTP, 0, $Callback)
Else
Local $conn = _FTP_Connect($Open, $IP, $ftpUser, $ftpPass, 1, $ftpPort, $INTERNET_SERVICE_FTP, 0, $Callback)
EndIf
If Not @error Then
; .... Hier lese ich die Konfi-Dateien des Receivers aus, um die entsprechenden Startverzeichnisse der Suche zu ermitteln.
; Hier deklariere ich erst die Variablen, die ich gleich mit Filmen, Bildern und XML-Dateien fülle. Danach kommt ein Array, das ich als Dateifilter verwende.
Local $sMovies = "", $sPics = "", $sXmls = ""
Local $aVideofilter[17][1] = [[".mkv"], [".ts"], [".avi"], [".divx"], [".wav"], [".asf"], [".aiff"], [".mpg"], [".mpeg"], [".m2p"], [".mpv"], [".vob"], [".m2ts"], [".mov"], [".m3u"], [".pls"]]
Local $aStartfolders = StringSplit($sStartfolders, @CRLF) ; $sStartfolders sind die oben ausgelesenen Verzeichnisse
If Not @error Then
For $i = 0 To 2 ; Die Suche findet in dieser Schleife statt. Damit lese ich also nur 2 Unterverzeichnisse aus.
For $j = 0 To UBound($aStartfolders) - 1
_FTP_DirSetCurrent($conn, $aStartfolders[$j])
If Not @error Then
$aFolder = _FTP_ListToArray($conn) ; Hier werden die Dateien eines Verzeichnisses eingelesen.
_ArrayDelete($aFolder, 0)
For $k = 0 To UBound($aFolder) - 1
If Not StringInStr($aFolder[$k], ".") And $aFolder[$k] <> ".timeshift" Then ; Wenn der Dateiname einen Punkt enthält (und nicht .timeshift heißt), ist es kein Verzeichnis.
_ArrayAdd($aStartfolders, $aStartfolders[$j] & "/" & $aFolder[$k]) ; Wenn es ein Verzeichnis ist, wird es dem $aStartfolders-Array angehängt, damit es im nächten Durchlauf durchsucht wird.
Else
For $l = 0 To UBound($aVideofilter) - 1
If StringInStr($aFolder[$k], $aVideofilter[$l][0], 1) Then ; Wenn die Datei eine Endung aus dem Videofilter-Array hat, wird sie als Film übernommen.
$sMovies &= $aStartfolders[$j] & "/" & $aFolder[$k] & @LF
ExitLoop
EndIf
Next
If StringInStr($aFolder[$k], ".jpg", 1) Or StringInStr($aFolder[$k], ".png", 1) Then $sPics &= $aStartfolders[$j] & "/" & $aFolder[$k] & @LF ; Diese Dateien sind Bilder
If StringInStr($aFolder[$k], ".xml", 1) Then $sXmls &= $aStartfolders[$j] & "/" & $aFolder[$k] & @LF ; Diese Dateien sind XML
EndIf
Next
EndIf
Next
Next
EndIf
; Hier folgt meine peinliche Interprogramm-Kommunikation :D
FileWrite($PathT & "ftp\allmovies.txt", $sMovies)
FileWrite($PathT & "ftp\allpics.txt", $sPics)
FileWrite($PathT & "ftp\allxml.txt", $sXmls)
IniWrite($ini, "Intern", "FTPSuche", "1")
Else
IniWrite($ini, "Intern", "FTPSuche", "0")
EndIf
Else
IniWrite($ini, "Intern", "FTPSuche", "0")
EndIf
Local $iFtpc = _FTP_Close($conn)
Local $iFtpo = _FTP_Close($Open)
Exit
Alles anzeigen
Das hat sicher schon jemand besser umgesetzt. Über solche Hinweise freue ich mich auch.