Konvertertool - Ordner übergreifend sauber Dateien suchen und auflisten

  • Hallo

    wie damals schon
    [ offen ] Konvertertool - Ordner übergreifend

    angetestet brauche ich nun wieder hilfe, die ganze zeit habe ich Daten in einem Ordner konvertieren lassen von .lwp in .odt

    Nun haben aber Unsere Kundenberater Ordnerstrukuren ohne Ende, sprich tief und pro ordner 0 - 4 Dateien.

    Also lohnt meine ($dateisuche = FileFindFirstFile($pfad & "\*." & $dateityp)) für einen Ordner nicht wirklich zeitsparend.

    Lösungsverusche gibts in obengenannte schon, nur die Auflistung da kennt keine äöü (und ähnliche) leider schreib mein Skript aber den fixen Pfad in die Öffnen anzeige von WordPro und OpenOffice und wenn da anstelle von äöü " kommt gehts net. :)

    Daher die Frage wie kann ich mir die Daten z.b. im Array auflisten und dann nachher rauslesen lassen?

    Ordnerstruktur zum Verdeutlichen:

    Kunden
    |-Berater1
    ....|--Kunde1
    ........|---Briefe
    ........|---Anschreibe
    ........|---Verträge
    ........|---offene Fragen
    ....|--Kunde2
    ........|---Briefe
    ........|---Anschreibe
    ........|---Verträge
    ........|---offene Fragen
    ....|--Kunde3
    ........|---Briefe
    ........|---Anschreibe
    ........|---Verträge
    ........|---offene Fragen
    |-Berater2
    ....|--Kunde1
    ........|---Briefe
    ........|---Anschreibe
    ........|---Verträge
    ........|---offene Fragen
    ....|--Kunde2
    ........|---Briefe
    ........|---Anschreibe
    ........|---Verträge
    ........|---offene Fragen
    .. .|--Kunde3
    ........|---Briefe
    ........|---Anschreibe
    ........|---Verträge
    ........|---offene Fragen
    |-Berater3
    ....|--Kunde1
    ........|---Briefe
    ........|---Anschreibe
    ........|---Verträge
    ........|---offene Fragen
    ....|--Kunde2
    ........|---Briefe
    ........|---Anschreibe
    ........|---Verträge
    ........|---offene Fragen
    ....|--Kunde3
    ........|---Briefe
    ........|---Anschreibe
    ........|---Verträge
    ........|---offene Fragen
    ...

    und so weiter ^^

    2 Mal editiert, zuletzt von fachinformadiga (23. Oktober 2008 um 08:45)

    • Offizieller Beitrag

    Mal ein Bsp. (schnellste Variante mit Objekt):

    Spoiler anzeigen
    [autoit]

    #include<array.au3>

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

    Global $StartPfad = @ScriptDir
    Global $FileTyp = 'au3'
    $aFiles = _GetFilesFolder_Rekursiv($StartPfad, $FileTyp, 0)

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

    _ArrayDisplay($aFiles)

    [/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; oder beliebiges Zeichen
    ; 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 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,1), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles,1)
    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]
  • genau so

    nur beim letzten hat er immer so VIERECK

    hast mal getestet?!

    bekommen wir das ncoh irgendwie weg? verfälscht ja auch den Pfad nachher im OpenOffice

    anonsten klasse muss ich nur noch son Pfad auswahl menu und eindung inputbox einbauen und die ausgabe basteln

    danke

    • Offizieller Beitrag

    Das liegt an dem Trennzeichen @CRLF, dass als zwei Zeichen gewertet wird. TrimStringRight(..., 1) reicht dann nicht.
    Am besten diese beiden Zeilen ändern:

    Zeile 39:

    [autoit]

    $aOut = StringSplit(StringTrimRight($strFiles,1), $sDelim, 1)

    [/autoit]


    in

    [autoit]

    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)

    [/autoit]

    und Zeile 46:

    [autoit]

    Return StringTrimRight($strFiles,1)

    [/autoit]


    in

    [autoit]

    Return StringTrimRight($strFiles, StringLen($sDelim))

    [/autoit]
    • Offizieller Beitrag

    Ja, da hatte ich vergessen das letzte Trennzeichen abzuschneiden ;) .
    So geht es:

    Spoiler anzeigen
    [autoit]

    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 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,1), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    If $aOut[0] <> 0 Then $aOut[$aOut[0]] = StringTrimRight($aOut[$aOut[0]], 1)
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc

    [/autoit]

    Oscar : Das Problem ist der nicht beschnittene letzte Arraywert - und @CRLF wird dort mit Länge 1 entfernt, für den String brauchts aber Länge 2 - seltsam ;) .

  • Danke funktioneirt super


    Dauert bei meiner Menge an dateien aber 3 Minuten bis fertig ^^ muss ich nochn tooltip einbauen

    danke ihr habt mir nen riesen schritt weiter geholfen.

    auslesen sollte ich selber schaffen bzw steht auch im anderen fred schon

    • Offizieller Beitrag

    Ja, du hast schon recht. Aber wenn ich vom letzten Array-Eintrag nur 1 Zeichen abschneide wird @CRLF entfernt. Schneide ich 2 ab, verschwindet auch der \ bei Ordnerausgabe, bei Dateiausgabe paßt es wieder. Seltsames Verhalten.

    ERledigt: Lag am Splitten.

    • Offizieller Beitrag

    Ich denke, das Problem ist, dass Du bei StringSplit nur ein Zeichen abschneidest. Das heißt, es bleibt @CR über. Das entfernst Du dann mit dem zweiten StringTrimRight. Verwendet man nun aber nur @CR oder nur @LF als Trennzeichen, dann wird ein Zeichen zuviel abgeschnitten. Deswegen hatte ich die Lösung mit StringLen gepostet, weil dann nur die Länge des Trennzeichens entfernt wird.

  • hi....

    mal ne frage wäre es so nicht schneller? u einfacher?

    [autoit]


    #include <array.au3>

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

    Global $found_A[1]

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

    _search("C:\","txt" )

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

    _ArrayDisplay ( $found_A )

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

    ;##################################################################################
    ; Func: - Verzeichnis durchsuchen nach *.* ( Unterverzeichnisse werden mit einbezogen )
    ; Input: $current,$ext (suchverzeichnis,Fileart[z.b. doc])
    ;##################################################################################

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

    Func _Search($current, $ext)

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

    Local $search = FileFindFirstFile($current & "\*.*")
    While 1
    Local $file = FileFindNextFile($search)
    If @error Or StringLen($file) < 1 Then ExitLoop
    If Not StringInStr(FileGetAttrib($current & "\" & $file), "D") And ($file <> "." Or $file <> "..") Then
    If StringRight($current & "\" & $file, StringLen($ext)) = $ext Then
    ;MsgBox(0, "Dateiendung " & $ext, $current & "\" & $file)
    ; Hier kopieren, löschen, umbennen etc.
    _ArrayAdd($found_A, $current & "\" & $file)
    ;_ArrayDisplay ($found_A)
    EndIf
    EndIf

    $found_A[0]= UBound ($found_A)-1


    If StringInStr(FileGetAttrib($current & "\" & $file), "D") And ($file <> "." Or $file <> "..") Then
    _Search($current & "\" & $file, $ext)
    EndIf
    WEnd
    FileClose($search)
    Return $found_A
    EndFunc

    [/autoit]

    MFG chris :!:

    • Offizieller Beitrag

    mal ne frage wäre es so nicht schneller? u einfacher?

    Haben wir schon ausprobiert, als ich damals die Funktion erstellt habe. Bei kleineren Verzeichnistiefen kann deine Methode schneller sein, aber bei großen Verzeichnistiefen und vielen Dateien/Ordner ist die Objektvariante unschlagbar.

    • Offizieller Beitrag

    _ArrayAdd() benutzt ReDim zum erweitern des Arrays und das ist extrem langsam.
    Du kannst es ja mal testen. Einmal mit der Routine und einmal mit der von Bugfix. Du solltest aber jeweils min. zwei Durchgänge machen, weil entweder Windows das eingelesene Verzeichnis in einen Cache packt oder die Festplatte cache't das selbst (weiß ich nicht so genau). Jedenfalls geht der zweite Aufruf deutlich schneller.

  • huhu


    hatte aufgrund anderer Projekte keine zeit bis jetzt.

    Nu sitz ich dran und checks nicht mehr wie ich die Daten aus dem Array auch weiter verwednen kann.

    hab die unterste Version von Bugfix

    Ich dachte mir ich müsste nur $aOut[n] auslesen wobei $aOut[0] die anzahl ist und ab 1 die Daten kommen.


    Leider ist es nciht so oder?!

    bitte um Hilfe ^^ Danke :)


    EDIT: Habs es is aFiles ^^ wiso hab ich das nicht vorher gesehen?! ^^

    ps. dieses textselect buttonchen vom Array display bekomm ich net?!

    Einmal editiert, zuletzt von fachinformadiga (7. Oktober 2008 um 14:00)

  • in dem Beispiel von Bugfix hier oben steht das Ergbnis dann in dem array $aFiles.

    Franz

    P.S. diese Funktion nutze ich sehr häufig. Sehr sehr praktisch ! :thumbup:


    war ich wohl zu langsam.... :D

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Danke Franz ,

    jo wie gesagt es ist mir kurz danach ins Auge gesprungen.


    Aber ein neues Problem ist aufgetreteten:

    $aFiles gibt ja folgendes aus "c:\tester\ordner\datei.lwp"

    soweit super nur ist im folgeprogramm was ich nicht beachtet hatte der Dateiname gefragt

    früher hatte ich ihn über findnextfile (o.ä,) ^^ nur im array steht er mit pfad, Open Office zeigt aber nur "datei.odt" als Fenstername an.

    mit stringtrimright und 3 kürze ich hinten die endung weg, gibts sowas ähnliches auch für den pfad? oder kann ichs bessernoch gleich richtig aus dem array auslesen?!

    da: stringtrimleft nicht funktioniert, da der pfad ja imemr anders lang ist ^^

    verstanden?! bin auch verwirrt ^^

  • schau ich mir grad an danke


    ps. kann ich vlt mit return mehrere ausgaben aus der funktion holen, weil da ist ja der dateiname drin?!

    weiß das seiner?! (siehe funktion von bugfix)

    mfg

    edit:

    also ich glaube des wird funktioneiren, danke :) autoit ist klasse, so viele Möglichkeiten Probleme zu lösen ^^

    Meld mich wenns geht ^^

    btw ist jeamnd interessiert an einem Tool das Word Pro/.lwp dateien in OpenOffice/.odt umwandelt?! das schreib ich ja grad ^^
    würds dann hier posten für euch, da ihr auch imemr direkt und super hilft.

    @ Bugfix darf ichs einbauen und dein Teil so Beschrieben lassen?! so Author bugfix etc ?!

    Einmal editiert, zuletzt von fachinformadiga (7. Oktober 2008 um 15:28)