Downloadliste inkl. Unterordner im servereigenem HTML Format erstellen.

  • Hallo Autoit Experten.

    Nachdem mir UserIsGratefull so wunderbar geholfen hat nun der nächste Baustein zu meiner Rundum-Glücklich Lösung im Bereich automatisierte Webseitenerstellung-

    Die Dateien eines Ordners (der wiederum auch Unterordner erhält) soll als Downloadliste aufbereitet werden.

    Alle Datein die dort liegen sollen aufgelistet werden und mit Ihrer Dateigröße html-mäßig so aufbereitet werden, daß ich es nur noch auf unseren Server uploaden muss.

    Ich habe mir dazu im Forum geeignete Codeschnipsel zusammengesucht und zusammengebastelt.
    .... und was soll ich sagen, es funktioniert sogar!

    Allerdings funktioniert dies nur für den Ordner, in dem ich das Script auch laufen lasse. Es sollte jedoch rekursiv funktionieren - also auch inkl Unterordner

    Folgendes habe ich:

    Spoiler anzeigen
    [autoit]


    #######################################
    ;#
    ;#
    ;#
    ;#######################################
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $search = FileFindFirstFile("*.*")

    [/autoit] [autoit][/autoit] [autoit]

    $localpath= "\\FRERICKST410W8\d\LFB\server"

    [/autoit] [autoit][/autoit] [autoit]

    ; Check ob Suche erfolgreich
    If $search = -1 Then
    MsgBox(0, "Fehler", "Keine Dateien gefunden")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    FileDelete("download.html")
    $filew = FileOpen("download.html", 1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If $filew = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf
    FileWriteLine($filew,'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' & @CRLF)
    FileWriteLine($filew,'<html xmlns="http://www.w3.org/1999/xhtml">' & @CRLF)
    FileWriteLine($filew,'<head>' & @CRLF)
    FileWriteLine($filew,'<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />' & @CRLF)
    FileWriteLine($filew,'<title>Alle Dateien herunterladen</title>' & @CRLF)
    FileWriteLine($filew,'</head>' & @CRLF)
    FileWriteLine($filew,'<body>' & @CRLF)
    FileWriteLine($filew,'<p>Hier k&ouml;nnen Sie alle Dateien herunterladen:</p>' & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    $i=0
    $F=1
    While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
    If $file= "download.html" or $file="makehtml.exe" then
    Else
    $size = ByteSuffix(FileGetSize($file))
    $suffix=StringRight ( $file, 3 )
    $datei=StringTrimRight ( $file, 4 )
    $dateipfad=StringReplace(StringReplace(@ScriptDir,$localpath,""),"","/") & '/' & $file
    FileWriteLine($filew, $datei & ': <img src="/pix/download.gif" alt="Download"/> <a href="' & $dateipfad & '" target="_blank">Herunterladen</a> [' & $suffix & '][' & $size & ']'&'<br>')
    $i=$i +1
    $F=$F+1
    EndIf
    WEnd
    FileWriteLine($filew,'</body> ' & @CRLF)
    FileWriteLine($filew,'</html> ' & @CRLF)
    FileClose($search)
    FileClose($filew)
    SplashOff()
    SplashTextOn("Fertig", "downloads.html wurde erfolgreich erstellt ! Es wurden " & $i & " Dateien gelistet", 420, 40, -1, -1, 4, "",10)
    Sleep(3000)
    SplashOff()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Diese Funktion formatiert den String zur Dateigröße
    Func ByteSuffix($iBytes)
    Local $iIndex, $aArray[9] = [' bytes', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB']
    While $iBytes > 1023
    $iIndex += 1
    $iBytes /= 1024
    WEnd
    Return Round($iBytes) & $aArray[$iIndex]
    EndFunc ;==>ByteSuffix

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]

    Wünschenswert wäre in der Downloadliste eine Kennzeichnung bei einem Verzeichniswechsel. So daß man in der Liste erkennt daß nun ein Verzeichniswechsel erfolgt.

    Hier ist mal ein Beispiel damit man es sich besser vorstellen kann.

    http://lehrerfortbildung-bw.de/faecher/bio/bs…/download/docs/


    Darüberhinaus wäre ein weiterer Schritt daß die Dateien der einzelnen Ordner jeweils automatisiert in einem ZIP Archiv zusammengefasst werden.

    So läge dann in jedem Ordner eine Zip Datei. Diese sollte dann den Ordner und den entsprechenden Verzeichnisast darunter enthalten.


    Ich habe es bereits mit _filelisttoarray von BugFix versucht. Aber das geht dann wohl über meinen Horizont.. jedenfalls will es nicht so wie ich will.


    Bin über jede Hilfe dankbar.

    Gruß Rochus

  • So kannst du unterordner mitdurchsuchen:

    [autoit]

    _searchForFiles("C:\Ordner")
    Func _searchForFiles($folder)
    $search=FileFindFirstFile($folder&"\\"&"*.*")
    while 1
    $file=FileFindNextFile($search)
    if @extended=1 then
    _searchForFiles($file)
    ElseIf @error=1 then
    ExitLoop
    else
    If NOT $file= "download.html" or NOT $file="makehtml.exe" then
    $size = ByteSuffix(FileGetSize($file))
    $suffix=StringRight ( $file, 3 )
    $datei=StringTrimRight ( $file, 4 )
    $dateipfad=StringReplace(StringReplace(@ScriptDir,$localpath,""),"","/") & '/' & $file
    FileWriteLine($filew, $datei & ': <img src="/pix/download.gif" alt="Download"/> <a href="' & $dateipfad & '" target="_blank">Herunterladen</a> [' & $suffix & '][' & $size & ']'&'<br>')
    $i=$i +1
    $F=$F+1
    EndIf
    endif
    WEnd
    EndFunc

    [/autoit]


    In @extended steht, wenn ein Ordner gefunden wurde.

  • Vielen Dank, Kanashius


    Ich hab mich selber noch mal rangemacht und die Funktion Getfolders_Rekursiv nun doch verwenden können.

    Letztendlich bin ich ein gutes Stück weiter gekommen.

    Meine momentane Lösung durchsucht alle Unterordner, findet alle Dateien, wandelt alle zu formatierten HTML Downloadlinks und listet alle in einer Datei auf.

    So weit so gut.

    Hier der Code

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include<Array.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;Pfad zum lokalen LFB Ordner - (dieser wird nachher benötigt um den Webpfad zu bilden)
    Local $localpath= "\\FRERICKST410W8\d\LFB\server" ;vom PC in den
    ;Local $localpath= "\\FRERICKST410W8\d\LFB\server" ;vom Notebook
    Local $sDirPath = @ScriptDir & "" ; Pfad des Verzeichnisbaum (mit "" am Ende Absicht)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Aufruf GetFilesFolder_Rekursiv (Dokumentation unten)

    [/autoit] [autoit][/autoit] [autoit]

    $ret = _GetFilesFolder_Rekursiv('.', -1,0,0)

    [/autoit] [autoit][/autoit] [autoit]

    ;Anzeigen der Liste

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($ret, 'Rekursiv alle Dateien')

    [/autoit] [autoit][/autoit] [autoit]

    ;Definition des HTML - Codes für den LFB Downloadlink

    [/autoit] [autoit][/autoit] [autoit]

    $html1 = ': <img src="http://lehrerfortbildung-bw.de/pix/download.gif" alt="Download"/> <a href="'
    $html2 = '" target="_blank">Herunterladen </a>'

    [/autoit] [autoit][/autoit] [autoit]

    ;Durchlaufen des Arrays

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound( $ret, 1 ) - 1

    [/autoit] [autoit][/autoit] [autoit]

    ;Aufsplitten des Pfades in die einzelnen Komponenten

    [/autoit] [autoit][/autoit] [autoit]

    $filo = StringMid($ret[$i], StringInStr($ret[$i],'\',1,-1)+1) ;Dateinamen mit Endung
    $path =StringLeft($ret[$i], StringInStr($ret[$i],'\',1,-1)) ;Pfad (enthält den Pfad vom 1. Zeichen bis zum letzten Backslash)
    $suffix= StringMid($ret[$i], StringInStr($ret[$i],'.',1,-1)+1) ;Dateiendung
    $file=StringLeft($filo, StringInStr($filo,'.',1,-1)-1) ;Dateinamen ohne Endung

    [/autoit] [autoit][/autoit] [autoit]

    ; Aufruf Unterfunktion Dateigröße

    [/autoit] [autoit][/autoit] [autoit]

    $size = ByteSuffix(FileGetSize($ret[$i]))

    [/autoit] [autoit][/autoit] [autoit]

    ;Konvertieren des Pfades für den Webserver

    [/autoit] [autoit][/autoit] [autoit]

    $webpath = StringReplace(StringReplace(@ScriptDir,$localpath,""),"","/") & '/' & $filo

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Schreibe in die Datei

    [/autoit] [autoit][/autoit] [autoit]

    FileClose( FileWrite( FileOpen( $sDirPath & "download.html", 1 + 8 ), $file & $html1 & $webpath & $html2 & '[' & $suffix & ']' & '[' & $size & ']' & '<br>' & @CRLF ))

    [/autoit] [autoit][/autoit] [autoit]

    Next

    [/autoit] [autoit][/autoit] [autoit]

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case '3'
    $sDelim = ';'
    Case '4'
    $sDelim = '|'
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Diese Funktion formatiert den String zur Dateigröße
    Func ByteSuffix($iBytes)
    Local $iIndex, $aArray[9] = [' bytes', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB']
    While $iBytes > 1023
    $iIndex += 1
    $iBytes /= 1024
    WEnd
    Return Round($iBytes) & $aArray[$iIndex]
    EndFunc ;==>ByteSuffix

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    Was geht noch nicht.

    Wenn ein Verzeichniswechsel kommt soll der auch mit einer Überschrift angezeigt werden. So ist es eine ellenlange Liste.
    Die die ZIP Problematik muss ich mich auch noch reinfuchsen.

    Hier bin ich auch wieder für Anregungen dankbar.

    Gruß Rochus

  • Hallo,

    ich weis, dass dies hier ein AutoIT-Forum ist, aber ehrlich gesagt habe ich noch nicht verstanden wozu hier AutoIt nötig ist.

    Dein Projekt lässt sich relativ leicht direkt per PHP lösen. Statt per AutoIT eine download.html-Datei zu erstellen, kannst du doch einfach eine download.php schreiben, die dann beim Aufruf im Browser des Besuchers in Echtzeit die Ordnerstruktur einliest und daraus die Dateiliste erstellt. Dann aktualisiert sich die Liste auch wirklich automatisch.

    Und wenn du nicht jedesmal die Dateiliste einlesen willst, kannst du in der PHP-Datei auch erst prüfen, ob es überhaupt eine Änderung gab. Falls ja, Liste neu aufbereiten und in Datei zwischenspeichern, falls nein, einfach den Inhalt der Datei ausliefern.

    Falsches Forum, aber m.E. die bessere Lösung für dein Projekt.

    Gruß
    HarryFox