Hilfe gebraucht bei einem 2D-Array

  • Hallo zusammen,
    ich brauche ma wieder eure hilfe bei einem teil meines Ordnerdurchsuchungsprogramm ^^ ich weiß bin nervig ^^

    Derzeitig erstellt mein Programm ein 2D-Array, in der ersten Spalte wird ein Ordnerpfad geschrieben, in der 2ten Spalte wird der Inhalt einer Datei niedergeschrieben.
    Jetzt will ich eine 3t Spalte erstellen und in dieser soll stehen welche dateien in diesem Ordnerpfad drinne stehen.

    Hier der Quellcode, wodurch es wahrscheinlich einfach wird meinen Ansätzen zu folgen:

    Spoiler anzeigen
    [autoit]

    ;Idee Herr Wegert. Umsetzung Herr Kellermann, mit Hilfe von Herr Wegert und einigen user von http://www.autoit.de Forum
    ;vielen Dank an Fabian, progandy, ideas2code, Water, M-Obi und Schnitzel
    ;====================================================================================================================================

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

    ;Recursive File Lister
    #include <Array.au3>
    #include <Date.au3>
    #include <file.au3>
    ;Main Programmm anfang

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

    ;deklaration der variablen
    Dim $FolderName = "E:\Autoit_testordner" ;zu durchsuchender ort
    Dim $FileCount = 0 ;setzt den zähler auf 0
    Dim $zeile = 1 ;setzen von size auf 10
    Dim $used = 0 ;setzen von used auf 0
    Dim $blocksize = 1 ;setzen von blocksize auf 1
    Dim $spalte = 3 ;setzen der spaltenanzahl auf 2
    Dim $avArray[$zeile][$spalte] ;erstellen eines arrays mit größe size und 2 spalte

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

    ScanFolder($FolderName) ;startet die durchsuchung des ortes
    _ArraySort($avArray) ;sortiert das Array
    MakeIndexFile($avArray) ;aufrufen von MakeIndexFile
    _ArrayDisplay($avArray, "Arrayinhalt") ;zeigt Fenster mit 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]

    ;beginn des durchsuchungvorganges
    Func ScanFolder($SourceFolder)
    Local $Search
    Local $File
    Local $FileAttributes
    Local $FullFilePath

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

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

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

    $avArray[$used][0] = $SourceFolder ;schreibt $sourcefolder in das Array
    $used = $used + 1 ;erweitert used um 1

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

    $StopfileName = $SourceFolder & "\STOPFILE.txt" ;setzen von $stopfilename
    $StopfileExists = FileExists($StopfileName) ;überprüfe ob STOPFILLE.txt exestiert und schreib 1 oder 0 in variable

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

    If $StopfileExists == 1 Then ;if stopfileexists true dann
    $avArray[$used - 1][1] = FileRead ($StopfileName) ;schreibe in array spalte 2 vorherige zeile inhalt auf stopfilename
    EndIf

    [/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

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

    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
    If (not $StopfileExists) Then ;prüfe ob STOPFILE.txt nicht vorhanden ist
    ScanFolder($FullFilePath) ;springe zu ScanFolder (schleife von vorne)
    EndIf
    Else
    ;$avArray[$used-1][2] = $File ;zu testzweck für Variante 2
    LogFile($FullFilePath) ;gehe zu LogFile
    EndIf

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

    WEnd
    ;schleifenende
    FileClose($Search)
    EndFunc

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

    ;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
    Local $Nr = 1
    Local $Nr2 = 1
    Local $sType = 4

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

    $html = FileOpen(@ScriptDir & "\filelist.html", 2) ;Datei wird im Schreibmodus geöffnet, aktueller Inhalt wird gelöscht. Wenn die 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 bgcolor=" & '"' & '#' & "218429" & '"' & ">")
    FileWriteLine(@ScriptDir & "\filelist.html", "<p>" & "<font color=" & '"' & "#" & "FFFFFF" & '"' & ">" & "<B>" & "<TT>" & "<Font size =+2" & ">" & "Laufwerkstand von " & $FolderName & " zuletzt ausgelesen am: " & _NowDate() & " um " & _NowTime($sType) & "</font>" & "</TT>" & "<br>" & "</p>")
    FileWriteLine(@ScriptDir & "\filelist.html", "<table border=" & '"1"' & ">" & "<tr>" & "<th>" & "Nr." & "</th>" & "<th>" & "Pfad" & "</th>" & "<th>" & "Intern" & "</th>" & "<th>" & "Extern" & "</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>" & "<font color=" & '"' & "#" & "FFFFFF" & '"' & ">" & $Nr & ")" & "</td>" & "<td>" & "<font color=" & '"' & "#" & "FFFFFF" & '"' & ">" & $avArray[$pos][0] & "</td>" & "<td>" & "</font>" & "<a href=" & '"' & '#' & "AnkerNr" & $Nr & '"' & ">" & "<img src=" & '"' & "Folder_open.GIF" & '"' & "alt=" & '"' & "Open" & '"' & ">" & "</a>" & "</td>" & "<td>" & "<a href=" & '"' & $avArray[$pos][0] & '"' & ">" & "<img src=" & '"' & "Change_symbol.GIF" & '"' & "alt=" & '"' & "Change" & '"' & ">" & "</a>" & "</td>" & "</tr>" & "<p>")
    $Nr = $Nr + 1
    Next

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

    FileWriteLine(@ScriptDir & "\filelist.html", "</table>")
    FileWriteLine(@ScriptDir & "\filelist.html", "<br>" & "<br>" & "<br>" & "<br>" & "<br>")

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

    ;teil zum erstellen der detailanzeige
    FileWriteLine(@ScriptDir & "\filelist.html", "<B>" & "<big>" & "Übersicht" & "</B>" & "</big>")

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

    For $pos = 0 To UBound($avArray) -1
    FileWriteLine(@ScriptDir & "\filelist.html", "<p align=" & '"' & "left" & '"' & ">" & "<b>" & "<font color=" & '"' & "#" & "FFFFFF" & '"' & ">" & "<a name=" & '"' & "AnkerNr" & $Nr2 & '"' & ">" & $avArray[$pos][0] & "</a>" & "</b>" & "<br>")
    FileWriteLine(@ScriptDir & "\filelist.html", "<p align=" & '"' & "left" & '"' & ">" & "<font color=" & '#' & "000000" & ">" & $avArray[$pos][1] & "</font>")
    $Nr2 = $Nr2 + 1
    Next

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

    ;ende erstellung der detailanzeige

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

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

    [/autoit]

    Ich habe überlegt und mir sind 2 Ansätze nur eingefallen um das umzusetzen.

    1) Derzeitig wird noch ein "Filelist.txt" erstellt wo die Dateien drinne stehen mit Pfad usw. Da wäre meine idee, diese zu nehmen und einzulesen, allerdings ist diese liste nicht sortiert, wodurch sehr wahrscheinlich die zuordnung nicht ordentlich erfolgt. Sprich müsste ich da eine Überprüfung stattfinden lassen.

    2)Beim Durchlauf für die "Filelist.txt" hat ehr ja eh schon die Datei im Speicher, also könnte man diese auch gleich im Array legen und damit würde die "Filelist.txt" später wegfallen können. Diesen Ansatz hab ich auch schon angetest mit dem Ergebniss, dass er manche dateien im Array falsch platziert, also müsste hier auch eine extra überprüfung nochma stattfinden.

    Ich bin jetzt leicht unschlüssig welche der beiden Varianten besser geeignet wäre um das ganze umzusetzen. Und 2 Fragen geistern mir dazu auch noch im Kopf^^

    Wie kann ich die Dateien einfach hintereinander als "File1,File2,File3..." schreiben lassen im array (also das es auch angezeigt wird)? Und ein Kollege meinte man könnte in einer Arrayzelle Zeilenumbrüche einbauen, stimmt das?

    Bin für jede andere Idee offen um das ganze umzusetzen :)
    Hoffe ihr könnt mir ein Schubser in die richtige Richtung geben :)

    freundliche Grüße und vielen Dank :)
    Maurawani

    2 Mal editiert, zuletzt von Maurawani (15. September 2010 um 10:29)

  • Bevor ich mich jetzt um dein "Problem" kümmere:
    Ein Array der 3 Spalten hat, ist noch lange kein 3D Array! Es ist immer noch ein 2D Array.

    [autoit]

    $aArray[5][3] ; 2D
    $aArray[1000][10000] ; 2D
    $aArray[5][4][3] ; 3D !

    [/autoit]

    Dein Code ist zwar gut kommentiert, aber dennoch unübersichtlich (bin ihn aber auch nur überflogen)

    Ich würde jedenfalls weder Array noch irgendwelche Dateien benutzen, sondern alles in Strings schreiben, und diese dann am Ende der Funktion teilen. So musst du dir keine Gedanken über Globale Variablen, Arrayverwaltung in der Funktion usw usw machen.

    Hab hier mal ein Beispiel, wenns dir dann doch nicht weiterhilft, hatte ich wenigstens was zu tun :D

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $aRet = FileListToArrayRek("D:\Musik\MUSIC international")
    _ArrayDisplay($aRet)

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

    Func FileListToArrayRek($sPfad, $b = False)
    Local $hFFFF, $sFFNF, $sFiles, $aFiles
    Local Static $iFound = 0
    If StringRight($sPfad, 1) <> "\" Then $sPfad &= "\"

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

    $hFFFF = FileFindFirstFile($sPfad & "*")
    Do
    $sFFNF = FileFindNextFile($hFFFF)
    If @error Then ExitLoop ; Keine Datei mehr
    If @extended Then ; Verz.
    $sFiles &= FileListToArrayRek($sPfad & $sFFNF, True) ; Verz. auch einlesen
    ContinueLoop ; An schleifenanfang springen
    EndIf
    $iFound += 1
    $sFiles &= $sPfad & $sFFNF & "||" & FileGetSize($sPfad & $sFFNF) & "||" & FileGetTime($sPfad & $sFFNF, 0, 1) & "|||"
    Until 0
    FileClose($hFFFF) ; Suchhandle schließen
    If Not $iFound Then Return 0
    If $b Then Return $sFiles

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

    Local $aTmp, $aFiles[$iFound][3], $aSplit = StringSplit($sFiles, "|||", 3)
    For $i = 0 To $iFound - 1
    $aTmp = StringSplit($aSplit[$i], "||", 3)
    $aFiles[$i][0] = $aTmp[0]
    $aFiles[$i][1] = $aTmp[1]
    $aFiles[$i][2] = $aTmp[2]
    Next
    Return $aFiles
    EndFunc ;==>FileListToArrayRek

    [/autoit]
  • Bevor ich mich jetzt um dein "Problem" kümmere:
    Ein Array der 3 Spalten hat, ist noch lange kein 3D Array! Es ist immer noch ein 2D Array.

    [autoit]

    $aArray[5][3] ; 2D
    $aArray[1000][10000] ; 2D
    $aArray[5][4][3] ; 3D !

    [/autoit]

    Dein Code ist zwar gut kommentiert, aber dennoch unübersichtlich (bin ihn aber auch nur überflogen)

    Ich würde jedenfalls weder Array noch irgendwelche Dateien benutzen, sondern alles in Strings schreiben, und diese dann am Ende der Funktion teilen. So musst du dir keine Gedanken über Globale Variablen, Arrayverwaltung in der Funktion usw usw machen.

    Stimmt ^^ wie kam ich depp auf 3d array :huh: :huh:

    das sagt irgendwie jeder, was is daran unübersichtlich?

    Leider muss ich Arrays benutzen, gehört mit zur aufgabe (an der ich schon einige woche arbeite)

    Edit: gleich ma im titel geändert ^^

  • Könntest du es nochmal kurz zusammenfassen wie genau du es willst?
    Werd aus den Text noch nicht ganz schlau.

    [autoit]


    $array[x][0] = Ordnerpfad
    $array[x][1] = Inhalt einer datei; die frage die ich mir stelle: Welche datei?
    $array[x][2] = Dateien im Ornder; getrennt mit Zeilenumbruch?

    [/autoit]
  • Könntest du es nochmal kurz zusammenfassen wie genau du es willst?
    Werd aus den Text noch nicht ganz schlau.

    [autoit]


    $array[x][0] = Ordnerpfad
    $array[x][1] = Inhalt einer datei; die frage die ich mir stelle: Welche datei? Der STOPFILE.txt (ist schon drinne
    $array[x][2] = Dateien im Ornder; getrennt mit Zeilenumbruch? Genau hier sollen hintereinander die Dateien rein, zeilenumbruch muss nicht sein, hat kollege nur erwähnt das es möglich ist

    [/autoit]

    Also was ich nun machen möchte.

    Bei der ordnerdurchsuchung findet das Script auch Dateien.
    In der ersten Spalte steht nun der Ordnerpfad und in der Dritten Spalte soll stehen welche Dateien nun in diesem Ordner sind. einfach nru aufgelistet.

    Einmal editiert, zuletzt von Maurawani (15. September 2010 um 07:29)

  • also ich habe mir da jetzt eine kleinigkeit gebastelt die funktioniert soweit bis auf eine kleinigkeit, die ich nicht weiß wie man die umsetzt

    Also ich will ja das nacher so steht im array

    spalte1| spalte2 | spalte3
    ordnerpfad | inhalt einer datei | dateien (datei1, datei2, datei3 ....)

    derzeitig steht es halt so drinne

    spalte1 | spalte2 | spalte3
    ordnerpfad | inhalt einer datei | datei (datei1)

    da meine schleife in spalte 3 immer die letzte gefundene datei reinschreibt

    Gibt eine möglichkeit, also ein Trennzeichen, das verhindert, dass das vorher reingeschriebene überschrieben wird?

  • So könntest du vorgehen um einen neuen wert anzuhängen
    (statt @CrLf kannst du natürlich auch ein anderes Trennzeichen verwenden, Standard wäre: | )

    [autoit]


    $array[x][2] &= @CrLf & $neuerwert

    [/autoit]