Ordnerdurchsuchung und in HTMLsite alles auflisten

  • Hallo liebe Commies :)

    Hab da ne kleine aufgabenstellung letztens von meinem Chef bekommen. Bin allerdings nciht so bewandert mit Programmierung in Autoit .

    Jedenfalls soll ich ein script schreiben was einen Ordner ausliest und das ganze dann als HTML site wiedergibt.

    Die ordnersuche ist rekursiv und hat mir mein Chef ausm Netz geholt, diesen habe ich schonmal auf unsere wünsche abgeändert.

    Spoiler anzeigen
    [autoit]

    ;Recursive File Lister
    #include <Array.au3>

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

    ;Main Programmm anfang
    Dim $FolderName = "H:\" ;Sagt welcher Ort zu durchsuchen ist
    Dim $FileCount = 0 ;setzt den zähler auf 0
    Dim $size = 10
    Dim $used = 0
    Dim $blocksize = 1
    Dim $avArray[$size]

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

    ScanFolder($FolderName) ;startet die durchsuchung des ortes
    _ArrayDisplay ($avArray, "Arrayinhalt")
    MsgBox(0,"Done","Folder Scan Complete. Scanned " & $FileCount & " Files") ;Ausgabebox mit Meldung das durchsuchung fertig ist und wieviele dateien/ordner gefunden wurden
    ;Main Programm ende
    MakeIndexFile()

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

    ;beginn des durchsuchungvorganges
    Func ScanFolder($SourceFolder) ;
    Local $Search ;initialisiert die variable "Search"
    Local $File ;initialisiert die variable "File"
    Local $FileAttributes ;initialisiert die variable "FileAttributes"
    Local $FullFilePath ;initialisiert die variable "FullFilePath"

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

    ;code für array

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

    If $used = $size Then
    $size = $size + $blocksize
    ReDim $avArray [$size]
    EndIf
    $avArray[$used] = $SourceFolder
    $used = $used + 1

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

    ;code für array

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

    $Search = FileFindFirstFile($SourceFolder & "\*.*") ; ?

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

    ;schleifenbeginn
    While 1
    If $Search = -1 Then ;
    ExitLoop
    EndIf

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

    $File = FileFindNextFile($Search)
    If @error Then ExitLoop

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

    $FullFilePath = $SourceFolder & "\" & $File
    $FileAttributes = FileGetAttrib($FullFilePath)

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

    If StringInStr($FileAttributes,"D") Then
    ScanFolder($FullFilePath)
    Else
    LogFile($FullFilePath)
    EndIf

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

    WEnd
    ;schleifenende

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

    FileClose($Search)
    EndFunc
    ;ende des durchsuchungvorganges

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

    ;beginn des vorganges zum schreiben in eine txt datei
    Func LogFile($FileName)
    FileWriteLine(@ScriptDir & "\FileList.txt",$FileName)
    $FileCount += 1
    EndFunc
    ;ende des vorganges zum schreiben in eine txt datei

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

    func MakeIndexFile()
    Local $pos = 0

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

    FileWriteLine (@scriptdir & "\filelist.html", "<html>")
    FileWriteLine (@scriptdir & "\filelist.html", "<head>")
    FileWriteLine (@scriptdir & "\filelist.html", "<title>")
    FileWriteLine (@scriptdir & "\filelist.html", "Laufwerkstand von " & $FolderName & "</title>")

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

    FileWriteLine (@scriptdir & "\filelist.html", "</head>")
    FileWriteLine (@scriptdir & "\filelist.html", "<body>")
    FileWriteLine (@scriptdir & "\filelist.html", "<p>Laufwerkstand von " & $FolderName & "<br>" & "</p>")

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

    while $pos = $blocksize
    FileWriteLine (@scriptdir & "\filelist.html", "<p>" & $avArray[$pos] & "<p>")
    $pos = $pos + 1
    wend
    FileWriteLine (@scriptdir & "\filelist.html", "</body>")
    FileWriteLine (@scriptdir & "\filelist.html", "</html>")

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

    EndFunc

    [/autoit]


    Jetzt hänge ich nur ein wenig was die auflistung in HTML angeht, derzeitig würd ich versuchen über eine whileschleife das genützte array auslesen und einschreiben, was aber (wie ich beim schreiben des ganzen feststelle) wohl garnicht möglich ist.

    Ok, aber jetzt zur frage. hat jemand von euch eine Idee wie das geht das ich die daten aus dem array in den htmlcode einfach übertragen kann.

    die auflistung soll so aussehen

    Nr. Pfad (hier kommen noch andere informationen später ran, die ich später erfahre)

    Vielen Dank schonma für eure Hilfe :)

    Maurawani

    PS: Ja, die Filelist.txt soll er weiter miterzeugen.

    2 Mal editiert, zuletzt von Maurawani (24. August 2010 um 14:18)

  • Habe durch ein bisschen rumprobieren es soweit laufend hinbekommen das es schonma klappt mit der htmlfile

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

    while $pos <= $size
    FileWriteLine (@scriptdir & "\filelist.html", "<p>" & "<a href=" & $avArray[$pos] & ">" & $avArray[$pos] & "</a>" & "<p>")
    $pos = $pos + 1

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

    wend

    [/autoit]

    Allerdings bekomme ich jetzt ne tolle meldung mit der ich nicht weiß wie die zu beseitigen ist

    Zitat

    Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    FileWriteLine (@scriptdir & "\filelist.html", "<p>" & "<a href=" & $avArray[$pos] & ">" & $avArray[$pos] & "</a>" & "<p>")
    FileWriteLine (@scriptdir & "\filelist.html", "<p>" & "<a href=" & ^ ERROR

    Kann mich da bitte wer erleuchten, sichtlich bedeutung, behebung und vermeidung?

    Danke und grüße

    Maurawani

    Einmal editiert, zuletzt von Maurawani (11. August 2010 um 14:50)

  • Die Fehlermeldung sagt es schon:

    Code
    Array variable has incorrect number of subscripts or subscript dimension range exceeded.:


    Du versuchst den Wert einer ungültigen Dimesion des Arrays zu bekommen.

    [autoit]

    while $pos <= $size
    FileWriteLine (@scriptdir & "\filelist.html", "<p>" & "<a href=" & $avArray[$pos] & ">" & $avArray[$pos] & "</a>" & "<p>")
    $pos = $pos + 1

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

    wend

    [/autoit]

    Kannst du viel kompakter gestalten:

    [autoit]

    For $pos=0 To Ubound($avArray)-1
    FileWriteLine (@scriptdir & "\filelist.html", "<p>" & "<a href=" & $avArray[$pos] & ">" & $avArray[$pos] & "</a>" & "<p>")
    Next

    [/autoit]

    Lg, Fabian

  • Wenn du die Dateien nur in der Auflistung brauchst, musst du gar kein Array erstellen, sondern kannst alles direkt in die Datei schreiben.

  • Wenn du die Dateien nur in der Auflistung brauchst, musst du gar kein Array erstellen, sondern kannst alles direkt in die Datei schreiben.

    wohl wahr, aber naja wie es so in der lehrzeit ist, man muss auch lernen wie arrays funktionieren und mit ihnen arbeiten auch wenns nicht die beste lösung ist für sowas^^

    Danke Fabian, werd ich morgen mal testen :)

  • Hallo, das alte problem ist ja gelöst, danke an Fabian nochmals :)

    jetzt allerdings möchte ich noch in die HTML das auslesedatum mit optional zeitpunkt sogar.

    hab schon ein wenig das forum durchsucht und auch was gefunden was den zweck erfüllt, nur hänge ich an der intergrierung in mein programm

    Spoiler anzeigen
    [autoit]

    #include <date.au3>

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

    $Time = _TimeGetByUnixFormat(1269779842)
    MsgBox(0, "", $Time)

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

    Func _TimeGetByUnixFormat($sTime)
    $sTime = _DateAdd( "s", $sTime, "1970/01/01 02:00:00")
    Return $sTime
    EndFunc ;==>_TimeGetByUnixFormat

    [/autoit]

    das datum soll dann eingefügt werden in den html code

    Spoiler anzeigen
    [autoit]

    func MakeIndexFile($avArray)
    Local $pos = 0 ;setzen von pos auf 0
    Local $Nr = 1 ;setzen von Nr auf 1

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

    FileWriteLine (@scriptdir & "\filelist.html", "<html>")
    FileWriteLine (@scriptdir & "\filelist.html", "<head>")
    FileWriteLine (@scriptdir & "\filelist.html", "<title>")
    FileWriteLine (@scriptdir & "\filelist.html", "Laufwerkstand von " & $FolderName & "vom" & "</title>")

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

    FileWriteLine (@scriptdir & "\filelist.html", "</head>")
    FileWriteLine (@scriptdir & "\filelist.html", "<body>")
    FileWriteLine (@scriptdir & "\filelist.html", "<p>Laufwerkstand von " & $FolderName & "<br>" & "</p>")

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

    for $pos=0 To Ubound($avArray)-1 ;forschleife zum auslesen des arrays
    FileWriteLine (@scriptdir & "\filelist.html", "<p>" & $Nr & ")" & " <a href=" & $avArray[$pos] & ">" & $avArray[$pos] & "</a>" & "<p>")
    $Nr = $Nr + 1
    Next

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

    FileWriteLine (@scriptdir & "\filelist.html", "</body>")
    FileWriteLine (@scriptdir & "\filelist.html", "</html>")
    EndFunc

    [/autoit]

    das nachher da steht

    Laufwerkstand von XX am [Datum]

    Bin selbst noch ein wenig am rumprobieren und hoffe es ncoh selbst hinzubekommen, freue mich natürlich wenn mir da wer helfen kann, reicht auch schubser in die richtige richtung :D

    Gruß und Dank
    Maurawani

    Einmal editiert, zuletzt von Maurawani (11. August 2010 um 14:51)

  • Ich denke, du suchst einfach eine dieser Funktionen:

    [autoit]

    _Now()
    _NowDate()
    _NowCalc()
    _NowCalcDate()

    [/autoit]
  • Ich denke, du suchst einfach eine dieser Funktionen:

    [autoit]

    _Now()
    _NowDate()
    _NowCalc()
    _NowCalcDate()

    [/autoit]

    Perfekt Danke progandy :)

    noch viel lernen ich haben^^

  • Hello again ^^

    Danke nochmal an progandy für die letzte hilfestellung :)

    Jetzt ist mir eine fixe idee im kopf entstanden für das script wovon mein chef noch nichts weiß :D

    also es darum, derzeitig wenn mein script läuft erstellt er ja die txt und die html datei und schreibt da rein.
    Wenn die entsprechenden dateien vorhanden sind schreibt er einfach in diese weiter rein, womit das aktuellste immer ganz unten ist. Jetzt war meine fixe idee, einfach eine kurzes script noch einzubauen welches genau nach diesen beiden dateien (der txt und der html) schaut, ob diese schon vorhanden sind und wenn ja das es diese löscht.

    Derzeitig würd ich versuchen das ganze mit einer whileschleife zu erstellen die ich ganz am anfang durchlaufen lasse.

    Allerdings fehlt mir einfach gerade das wissen für die diese Umsetzung z.B. wie lege ich fest das er im scriptdirectory nur nach den 2 dateien sucht, das makieren der beiden.


    könnte mir jemand ein großen schubs in die richtige richtung geben, damit ich das ganze umsetzen kann.


    Vielen Dank für die hilfe und geduld mit mir :) und liebe grüße an alle helfer

  • Dafür musst du dein Skript nur ein wenig umstellen.

    Spoiler anzeigen
    [autoit]


    $html = FileOpen(@ScriptDir & "die.html", 2) ; Datei wird im Schreibmodus geöffnet, aktueller Inhalt wird gelöscht. Wenn di Datei nicht existiert wird sie erstellt.
    FileWriteLine ($html, "<html>")
    FileWriteLine ($html, "<head>")
    FileWriteLine ($html, "<title>")
    FileWriteLine ($html, "Laufwerkstand von " & $FolderName & "vom" & "</title>")

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

    FileWriteLine ($html, "</head>")
    FileWriteLine ($html, "<body>")
    FileWriteLine ($html, "<p>Laufwerkstand von " & $FolderName & "<br>" & "</p>")

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

    ; usw ....

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

    FileClose($html)

    [/autoit]
  • Vielen Dank, klappt super :)
    und viel einfacher als ich dachte ^^

  • Hier mal der aktuelle stand des scripts für alle die es auch interessiert :)

    Spoiler anzeigen
    [autoit]

    ;Recursive File Lister
    #include <Array.au3>
    #include <Date.au3>

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

    ;Main Programmm anfang
    ;deklaration der variablen
    Dim $FolderName = "H:\Autoit_testordner" ;Sagt welcher Ort zu durchsuchen ist
    Dim $FileCount = 0 ;setzt den zähler auf 0
    Dim $size = 10;setzen von size auf 10
    Dim $used = 0;setzen von used auf 0
    Dim $blocksize = 1; setzen von blocksize auf 1
    Dim $avArray[$size];erstellen eines arrays mit größe size

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

    ScanFolder($FolderName) ;startet die durchsuchung des ortes
    MakeIndexFile($avArray);aufrufen von MakeIndexFile
    _ArrayDisplay ($avArray, "Arrayinhalt")
    MsgBox(0,"Done","Folder Scan Complete. Scanned " & $FileCount & " Files") ;Ausgabebox mit Meldung das durchsuchung fertig ist und wieviele dateien/ordner gefunden wurden

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

    ;Main Programm ende

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

    ;beginn des durchsuchungvorganges
    Func ScanFolder($SourceFolder) ;
    Local $Search ;initialisiert die variable "Search"
    Local $File ;initialisiert die variable "File"
    Local $FileAttributes;initialisiert die variable "FileAttributes"
    Local $FullFilePath ;initialisiert die variable "FullFilePath"

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

    ;schleife zur überprüfung der arraygröße
    If $used = $size Then ;wenn used gleich size ist
    $size = $size + $blocksize;erweitern von size um blocksize
    ReDim $avArray [$size];vergrößern des arrays
    EndIf

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

    $avArray[$used] = $SourceFolder;wenn arrayposition gleich SourceFolder ist
    $used = $used + 1;erweiter used um 1

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

    $Search = FileFindFirstFile($SourceFolder & "\*.*") ;finde erste datei

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

    ;schleifenbeginn zum durchsuchen der ordner und schreiben in eine txt datei
    While 1
    If $Search = -1 Then ;wenn search nichts vorhanden ist dann
    ExitLoop;dann verlasse schleife
    EndIf

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

    $File = FileFindNextFile($Search);nächste file finden
    If @error Then ExitLoop;fehler = schleife verlassen

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

    $FullFilePath = $SourceFolder & "\" & $File;zusammensetzen des pfades der datei
    $FileAttributes = FileGetAttrib($FullFilePath);attribute abfragen

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

    If StringInStr($FileAttributes,"D") Then;überprüfe FileAttributes, wenn D(irectory) dann
    ScanFolder($FullFilePath);springe zu ScanFolder (schleife von vorne)
    Else
    LogFile($FullFilePath);gehe zu LogFile
    EndIf

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

    WEnd
    ;schleifenende

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

    FileClose($Search)
    EndFunc
    ;ende des durchsuchungvorganges

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

    ;beginn des vorganges zum schreiben in eine txt datei
    Func LogFile($FileName)
    FileWriteLine(@ScriptDir & "\FileList.txt",$FileName);Schreibe in Filelist.txt FileName
    $FileCount += 1;erhöhe FileCount um 1
    EndFunc
    ;ende des vorganges zum schreiben in eine txt datei

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

    ;beginn der erstellung einer HMTL datei mit Verlinkung zum Directory
    func MakeIndexFile($avArray)
    Local $pos = 0;setzen von pos auf 0
    Local $Nr = 1;setzen von Nr auf 1
    Local $sType = 4;zur festlegung des Datumformats
    Local $zahl = 1;gitternetzmaße

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

    $html = FileOpen(@ScriptDir & "\filelist.html", 2); Datei wird im Schreibmodus geöffnet, aktueller Inhalt wird gelöscht. Wenn di Datei nicht existiert wird sie erstellt.
    FileWriteLine (@scriptdir & "\filelist.html", "<html>")
    FileWriteLine (@scriptdir & "\filelist.html", "<head>")
    FileWriteLine (@scriptdir & "\filelist.html", "<title>")
    FileWriteLine (@scriptdir & "\filelist.html", "Laufwerkstand von " & $FolderName & " zuletzt ausgelesen am: " & _NowDate() & " um " & _NowTime($sType) & "</title>")

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

    FileWriteLine (@scriptdir & "\filelist.html", "</head>")
    FileWriteLine (@scriptdir & "\filelist.html", "<body>")
    FileWriteLine (@scriptdir & "\filelist.html", "<p>Laufwerkstand von " & $FolderName & " zuletzt ausgelesen am: " & _NowDate() & " um " & _NowTime($sType) & "<br>" & "</p>")
    FileWriteLine (@ScriptDir & "\filelist.html", "<table border=" & $zahl & ">" & "<tr>" & "<th>" & "Nr." & "</th>" & "<th>" & "Pfad" & "</th>" & "</tr>")

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

    for $pos=0 To Ubound($avArray)-1;forschleife zum auslesen des arrays
    FileWriteLine (@scriptdir & "\filelist.html", "<p>" & "<tr>" & "<td>" & $Nr & ")" & "</td>" & "<td>" & " <a href=" & $avArray[$pos] & ">" & $avArray[$pos] & "</a>" & "</td>"& "<p>")
    $Nr = $Nr + 1
    Next

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

    FileWriteLine (@ScriptDir & "\filelist.html", "</table>")
    FileWriteLine (@scriptdir & "\filelist.html", "</body>")
    FileWriteLine (@scriptdir & "\filelist.html", "</html>")
    FileClose($html)
    EndFunc
    ;ende der erstellung

    [/autoit]

    nachgetragen :) des fehlende danke, ich blindfisch ^^

    Einmal editiert, zuletzt von Maurawani (11. August 2010 um 14:38)

  • Vielen Dank an alle Helfer.
    Das script funktioniert bisher super und wird derzeitig weiterbearbeitet und erweitert.
    Wenn das script komplett fertig ist werde ich es hier nochmal eintragen :)

    mfg Maurawani

    PS: Wie setzt ich den thread auf gelöst ^^?