Konvertertool - Ordner übergreifend

  • Hallo,

    folgende Situation ich hab mirn Konverter geschrieben der mit Word Pro Dateien in Open Office Dokumente umwandelt.

    Dies Funktioniert im Moment darüber das er über den Befehl FileFindFirstFile (etc.) die Dokumente im Ordner (den ich vorher explizit angegeben habe) aufruft und nacheinander aufruft und umwandelt.

    Das funktioiert Prima

    nur haben ich auch User die haben eine Tiefgefächerte Ordner Struktur und überall nur 4-5 Dokumente und es is aufwenig immer den PFad zu den 4-5 Dokumenten anzugeben.

    Die Frage ist ob es für eine Ordner struktur auch so eine Funktion gibt um die durchzugehen?

    z.B.

    -Aufträge Dezember
    - Ordner Verkauf
    - Ordner Bar
    - Ordner Vorkasse
    - Ordner Einkauf
    - Ordner Sontiges
    - Ordner Bar

    in jedem der Ordner in der Struktur liegen Dokumente.

    Die Ganze zeit muss ich dann explizit C:\Aufträge Dezember\Ordner Verkauf\Ordner Bar\
    angeben damit er die Daten im Ordner konvertiert.

    nun ist die Frage gibt es auch eine Funktion ähnlich der Findfirstfile Funktion nur für Ordner strukturen?

    Danke ;->

  • Hi, Du kannst natürlich auch über dir /s /b - glaube ich - nach Dateien durchsuchen. Entweder Du liest das Dir Ergebnis mit StdOut() aus oder Du leitest mit dir *.* /S /B > c:\ergebnis.txt das Ergebnis in eine Textdatei um um, die Du dann ausliest. Gruss Jan

    • Offizieller Beitrag

    Hi,

    hier ein Bsp:

    Spoiler anzeigen
    [autoit]

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

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

    ; Variablen
    Global $lines_A
    Global $tempFile = _TempFile("C:\", "jpg_", ".txt", 7)
    Global $fileSize = 300 ; in KByte

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

    Global $folder = FileSelectFolder('Aus welchen Ordner sollen Dateien gelöscht werden?', '\', 6, StringLeft(@ScriptDir, 3))
    If @error Then
    MsgBox(16, 'Error', 'Es wurde kein Ordner ausgwählt', 5)
    Exit (0)
    EndIf

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

    Global $filter = InputBox('Filter', 'Bitte den Filter definieren z.B. jpg : ', 'jpg')

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

    RunWait('"' & @ComSpec & '" /c dir *.' & $filter & ' /S /B > ' & $tempFile, $folder, @SW_HIDE)

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

    If Not _FileReadToArray($tempFile, $lines_A) Then
    MsgBox(4096, "Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf

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

    _ArrayDelete($lines_A, UBound($lines_A))
    _ArrayDisplay($lines_A, "ALLE") ; zur Anzeige der gefundenen Dateien

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

    For $i = UBound($lines_A) - 1 To 1 Step - 1
    If (FileGetSize($lines_A[$i]) / 1024) > $fileSize Then _ArrayDelete($lines_A, $i)
    Next

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

    $lines_A[0] = UBound($lines_A)

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

    _ArrayDisplay($lines_A, "kleiner der Grenze: " & $fileSize) ; zur Anzeige der übrig gebliebenen Dateien

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

    For $i = UBound($lines_A) - 1 To 1 Step - 1
    ;FileDelete($lines_A[$i]
    Next

    [/autoit]

    Mega

  • Dein Beispiel teste ich mal und schreibe es ggf um

    Ob ich nun immer per FindFirstFile suche und dann die nächste udn nächste drucharbeite oder aus einem Array rauslese ist meinem Rest vom programm glaueb ich ziemlich schnuppe :)

    Danke erstmal

  • ^soo neue Infos

    also es "würde" schon funktionieren aber, das Dumme ist da ich ordner mit ä ü ö und Leerzeichen habe und dass schnallt leider der Dir Befehl nicht :(

    Kann ich vlt sont irgendwie die Sachen in eine Array Einlesen? ich muss nachher den genauen Pfad E:\blubb\bläö\dings und dangs\office.doc Open Office bei bringen ^^


    Thx schonmal


    EDIT: Neue Erkenntnis das Problem liegt an > weil es keine äöüß ausgitb in die txt Datei, anzeigen kanns die cmd in sich schon nur in eine txt kann ers nicht sauber schreiben

    Help :(

    Einmal editiert, zuletzt von fachinformadiga (17. April 2008 um 13:42)

    • Offizieller Beitrag

    Hi,

    kleiner Test:

    Spoiler anzeigen
    [autoit]

    #Include <GUIConstants.au3>
    #Include <File.au3>
    ; #Include <Array.au3>
    GUICreate('Recursive FileList', 800, 600, -1, -1)
    $label = GUICtrlCreateLabel('', 5, 10, 790, 30)
    $edit1 = GUICtrlCreateEdit('', 5, 45, 790, 540)
    GUISetState()

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

    Global $Files = '', $count
    Global $fpath = 'c:\Downloads\AutoIt-Skripte\Entwicklung\ForumTests\'

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

    GUICtrlSetData($label, $fpath)

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

    $start = TimerInit()

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

    _FileListToString($fpath)

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

    $diff = TimerDiff($start)

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

    GUICtrlSetData($edit1, $Files)
    GUICtrlSetData($label, Round($diff/1000, 3) & ' sek. / ' & $count & ' Dateien')

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

    ; Global $aFileList = StringSplit($Files, @CRLF)
    ; _ArrayDisplay($aFileList)

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _FileListToString($path)
    Local $hSearch, $sFile
    $hSearch = FileFindFirstFile($path & '*.*')
    If $hSearch <> -1 Then
    While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then
    SetError(0)
    ExitLoop
    EndIf
    If StringInStr(FileGetAttrib($path & $sFile), "D") <> 0 Then ContinueLoop
    $count += 1
    $Files &= $path & $sFile & @CRLF
    WEnd
    FileClose($hSearch)
    EndIf
    _ReFileListToString($path)
    EndFunc

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

    Func _ReFileListToString($path)
    GUICtrlSetData($label, ' ' & $path)
    Local $dFileList = _FileListToArray($path, '*', 2)
    If IsArray($dFileList) Then
    For $i = 1 To $dFileList[0]
    Local $hSearch, $sFile
    $hSearch = FileFindFirstFile($path & $dFileList[$i] & "\" & '*.*')
    If $hSearch <> -1 Then
    While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then
    SetError(0)
    ExitLoop
    EndIf
    If StringInStr(FileGetAttrib($path & $dFileList[$i] & "\" & $sFile), "D") <> 0 Then ContinueLoop
    $count += 1
    $Files &= $path & $dFileList[$i] & "\" & $sFile & @CRLF
    WEnd
    FileClose($hSearch)
    EndIf
    _ReFileListToString($path & $dFileList[$i] & '\')
    Next
    EndIf
    EndFunc

    [/autoit]

    Mega

  • huhu danke

    kann mich jetzt erst wieder damit beschäftigen


    nun is die frage wie ich die liste auf .lwp Endung begrenze/kürze und wie ich die sachen sag ich mal reihenweise abarbeiten kann/ ansprechen kann

    array zeile 1 ?!

  • nun muss ich mir nur noch angugge wie ichs aus dem array rauslese un ein mein probgramm fummele

    wie sprech ich die daten nahcher an mit array numemrn oder?

  • Hi Mega,
    ich habe was gesucht und bin über deine Funktion gestolpert.

    Ist echt super und vor allem schnell.

    Gruß
    Wolke