Advertisement
Guest User

Untitled

a guest
Jan 7th, 2013
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 10.40 KB | None | 0 0
  1. #region Rekursive Ordnerauflistung Funktion
  2. #include <Array.au3>
  3. #include <File.au3>
  4. #include <Crypt.au3>
  5.  
  6. ;*******************************************************************************************************************************************************************************************************************************************
  7. ;    Funktion        _ordner_rekursiv($udf_quellordner[, $udf_Ordner_Dateien[, $udf_unterordner=True[, $udf_spalte_datum=False[, $udf_dateityp = "*"[, $udf_auslassen = ""]]]]])
  8. ;    Beschreibung    ermittelt alle Dateien/Ordner des angegebenen Verzeichnisses
  9. ;    Parameter        $udf_quellordner:        der zu durchsuchende Ordner            (Angabe: einzelner Ordner als String     oder     mehrere Ordner im Array beginnend bei 1)
  10. ;        optional    $udf_Ordner_Dateien:    1 = Dateien auflisten (Standard)        2 = Ordner auflisten
  11. ;        optional    $udf_unterordner:        True = Unterordner miteinbeziehen (Standard)            False = Unterordner nicht miteinbeziehen
  12. ;        optional    $udf_spalte_datum:        True = Änderungsdatum der Datei ermitteln        False = Änderungsdatum der Datei nicht ermitteln (Standard)
  13. ;        optional    $udf_dateityp:            einzuschließende Dateitypen (mehrere Typen durch | trennen)        "*" >>> alle (Standard)
  14. ;        optional    $udf_auslassen:            Wörter, die im Pfad oder Dateinamen vorkommen, auslassen (mehrere durch | trennen)        "" <<< Standard
  15. ;    Rückgabewert    Erfolg:        Gibt ein Array mit 3 Spalten zurück (Dateiname, Dateipfad, Änderungsdatum)
  16. ;                    Fehler:        0    setzt @error
  17. ;                                @error = 1 mindestens 1 Pfad existiert nicht
  18. ;    Autor            Tweaky  (www.autoit.de)
  19. ;*******************************************************************************************************************************************************************************************************************************************
  20.  
  21.  
  22. ;********************************************
  23. ;        Ordner rekursiv (Hauptfunktion)     *
  24. ;********************************************
  25.  
  26. Func _ordner_rekursiv($udf_quellordner, $udf_Ordner_Dateien = 1, $udf_unterordner = True, $udf_spalte_datum = False, $udf_dateityp = "*", $udf_auslassen = "")
  27.     Local $verzeichnisse_alle[1] ;Array für die Ordner
  28.     Local $array_alles[1000000][3] ;Array für die Ordner und Dateien
  29.     Local $szDrive, $szDir, $szFName, $szExt
  30.  
  31.     If Not IsArray($udf_quellordner) Then ;Falls der Quellordner kein Array ist, ein Array erstellen
  32.         $udf_quellordner_tmp = $udf_quellordner
  33.         Dim $udf_quellordner[2]
  34.         $udf_quellordner[0] = 1
  35.         $udf_quellordner[1] = $udf_quellordner_tmp
  36.     EndIf
  37.  
  38.     For $i = 1 To UBound($udf_quellordner) - 1
  39.         If Not FileExists($udf_quellordner[$i]) Or Not StringInStr($udf_quellordner[$i], ":") Then
  40.             SetError(1) ;mindestens 1 Pfad existiert nicht
  41.             Return 0
  42.         EndIf
  43.  
  44.         If StringRight($udf_quellordner[$i], 1) <> "\" Then $udf_quellordner[$i] &= "\"
  45.  
  46.         $udf_quellordner_einzeln = $udf_quellordner[$i]
  47.  
  48.         If $udf_unterordner = True Then ;mit Unterordner
  49.             _ordner_rekursiv_mit_unterordner($udf_quellordner_einzeln, $verzeichnisse_alle)
  50.             _ArrayAdd($verzeichnisse_alle, $udf_quellordner_einzeln)
  51.         Else ;ohne Unterordner
  52.             $verzeichnisse_alle = $udf_quellordner
  53.         EndIf
  54.     Next
  55.  
  56.     If IsArray($verzeichnisse_alle) Then $verzeichnisse_alle[0] = UBound($verzeichnisse_alle) - 1 ;In die erste Zeile die Anzahl der Dateien schreiben
  57.  
  58.     $zaehler_fortlaufend = 0
  59.  
  60.     If $udf_Ordner_Dateien = 1 Then ;Dateien auflisten
  61.  
  62.         If Not IsArray($verzeichnisse_alle) Then
  63.             $verzeichnisse_alle_tmp = $verzeichnisse_alle
  64.             Local $verzeichnisse_alle[2] ;Array für die Ordner
  65.             $verzeichnisse_alle[1] = $verzeichnisse_alle_tmp
  66.         EndIf
  67.  
  68.         For $u = 1 To UBound($verzeichnisse_alle) - 1
  69.             $array_alle_dateien = _FileListToArray($verzeichnisse_alle[$u], "*", 1)
  70.  
  71.             For $k = 1 To UBound($array_alle_dateien) - 1
  72.                 $kriterien_ok = 0
  73.  
  74.                 If $udf_dateityp = "*" Then ;Dateityp nicht angegeben oder alle Dateien
  75.                     $kriterien_ok = 1
  76.                 Else ;1 oder mehrere Dateitypen angegeben
  77.                     $dateityp_split = StringSplit($udf_dateityp, "|")
  78.                     $udf_dateiendung_array = _PathSplit($array_alle_dateien[$k], $szDrive, $szDir, $szFName, $szExt)
  79.                     $udf_dateiendung = $udf_dateiendung_array[4]
  80.                     For $i = 1 To UBound($dateityp_split) - 1
  81.                         If "." & $dateityp_split[$i] = StringRight($array_alle_dateien[$k], StringLen($udf_dateiendung)) Then
  82.                             $kriterien_ok = 1
  83.                             ExitLoop
  84.                         EndIf
  85.                     Next
  86.                 EndIf
  87.  
  88.                 If $udf_auslassen <> "" Then ;Wörter in dem Pfad und Datei auslassen
  89.                     $auslassen_split = StringSplit($udf_auslassen, "|")
  90.                     For $i = 1 To UBound($auslassen_split) - 1
  91.                         If StringInStr($array_alle_dateien[$k], $auslassen_split[$i]) Or StringInStr($verzeichnisse_alle[$u], $auslassen_split[$i]) Then
  92.                             $kriterien_ok = 0
  93.                             ExitLoop
  94.                         EndIf
  95.                     Next
  96.                 EndIf
  97.  
  98.  
  99.                 ;Papierkorb und System Volume Information wird nicht aufgelistet
  100.                 If StringInStr($array_alle_dateien[$k], 'RECYCLER') Or StringInStr($verzeichnisse_alle[$u], 'RECYCLER') _
  101.                         Or StringInStr($array_alle_dateien[$k], 'RECYCLED') Or StringInStr($verzeichnisse_alle[$u], 'RECYCLED') _
  102.                         Or StringInStr($array_alle_dateien[$k], 'System Volume Information') Or StringInStr($verzeichnisse_alle[$u], 'System Volume Information') _
  103.                         Or StringInStr($array_alle_dateien[$k], '$RECYCLE.BIN') Or StringInStr($verzeichnisse_alle[$u], '$RECYCLE.BIN') Then
  104.                     $kriterien_ok = 0
  105.                     ExitLoop
  106.                 EndIf
  107.  
  108.                 ;wenn der Dateityp passt und die Datei bzw. der Ordner nicht ausgelassen werden soll
  109.                 If $kriterien_ok = 1 Then
  110.                     $zaehler_fortlaufend += 1
  111.                     $array_alles[$zaehler_fortlaufend][0] = $verzeichnisse_alle[$u]
  112.                     $array_alles[$zaehler_fortlaufend][1] = $array_alle_dateien[$k]
  113.                     If $udf_spalte_datum = True Then $array_alles[$zaehler_fortlaufend][2] = FileGetTime($verzeichnisse_alle[$u] & $array_alle_dateien[$k], 0, 1)
  114.                 EndIf
  115.             Next
  116.         Next
  117.  
  118.     Else ;Ordner auflisten
  119.         For $i = 1 To UBound($verzeichnisse_alle) - 1
  120.             $kriterien_ok = 1
  121.  
  122.             ;Papierkorb und System Volume Information wird nicht aufgelistet
  123.             If StringInStr($verzeichnisse_alle[$i], 'RECYCLER') Or StringInStr($verzeichnisse_alle[$i], 'RECYCLED') _
  124.                     Or StringInStr($verzeichnisse_alle[$i], 'System Volume Information') Or StringInStr($verzeichnisse_alle[$i], '$RECYCLE.BIN') Then
  125.                 $kriterien_ok = 0
  126.                 ExitLoop
  127.             EndIf
  128.  
  129.             If $kriterien_ok = 1 Then
  130.                 $zaehler_fortlaufend += 1
  131.                 $array_alles[$zaehler_fortlaufend][0] = $verzeichnisse_alle[$i]
  132.             EndIf
  133.         Next
  134.     EndIf
  135.  
  136.     ;Leere Zeilen am Ende löschen
  137.     ReDim $array_alles[$zaehler_fortlaufend + 1][3]
  138.  
  139.     ;In die erste Zeile die Anzahl der Dateien schreiben
  140.     If IsArray($array_alles) Then $array_alles[0][0] = UBound($array_alles) - 1
  141.  
  142.     $verzeichnisse_alle = 0 ;Array löschen
  143.  
  144.     Return $array_alles ;Array zurückgeben
  145. EndFunc   ;==>_ordner_rekursiv
  146.  
  147.  
  148.  
  149. ;**************************************
  150. ;        Unterordner durchsuchen          *
  151. ;**************************************
  152.  
  153. Func _ordner_rekursiv_mit_unterordner($udf_quellordner, ByRef $verzeichnisse_alle)
  154.     $verzeichnisse = _FileListToArray($udf_quellordner, "*", 2)
  155.  
  156.     For $i = 1 To UBound($verzeichnisse) - 1
  157.         $verzeichnisse[$i] = $udf_quellordner & $verzeichnisse[$i] & "\"
  158.         _ArrayAdd($verzeichnisse_alle, $verzeichnisse[$i])
  159.         _ordner_rekursiv_mit_unterordner($verzeichnisse[$i], $verzeichnisse_alle)
  160.     Next
  161. EndFunc   ;==>_ordner_rekursiv_mit_unterordner
  162. #endregion Rekursive Ordnerauflistung Funktion
  163. Func _DirCopyBackup($sSource,$sTarget,$sBackupFolder)
  164.     _Crypt_Startup()
  165.     Local $iCounterDirCopyBackup = 1
  166.     Local $iCounterDirCopyBackup2 = 1
  167.     Local $fFound = 0
  168.     Local $aSourceRekursiv = _ordner_rekursiv($sSource)
  169.     Local $aTargetRekursiv = _ordner_rekursiv($sTarget)
  170.     For $iCounterDirCopyBackup = 1 To Ubound($aSourceRekursiv)-1
  171.         For $iCounterDirCopyBackup2 = 1 To Ubound($aTargetRekursiv)-1
  172.             If StringTrimLeft($aSourceRekursiv[$iCounterDirCopyBackup][0] & $aSourceRekursiv[$iCounterDirCopyBackup][1],StringLen($sSource)) = StringTrimLeft($aTargetRekursiv[$iCounterDirCopyBackup2][0] & $aTargetRekursiv[$iCounterDirCopyBackup2][1],StringLen($sTarget)) Then
  173.                 If Not _Crypt_HashFile($aSourceRekursiv[$iCounterDirCopyBackup][0] & $aSourceRekursiv[$iCounterDirCopyBackup][1],$CALG_MD5) = _Crypt_HashFile($aTargetRekursiv[$iCounterDirCopyBackup2][0] & $aTargetRekursiv[$iCounterDirCopyBackup2][1], $CALG_MD5) Then
  174.                     FileCopy($aSourceRekursiv[$iCounterDirCopyBackup][0] & $aSourceRekursiv[$iCounterDirCopyBackup][1],$sBackupFolder & StringTrimLeft($aTargetRekursiv[$iCounterDirCopyBackup2][0] & $aTargetRekursiv[$iCounterDirCopyBackup2][1],StringLen($sTarget)),9)
  175.                     FileCopy($aSourceRekursiv[$iCounterDirCopyBackup][0] & $aSourceRekursiv[$iCounterDirCopyBackup][1],$aTargetRekursiv[$iCounterDirCopyBackup2][0] & $aTargetRekursiv[$iCounterDirCopyBackup2][1],1)
  176.                     $fFound = 1
  177.                 Else
  178.                     $fFound = 1
  179.                 EndIf
  180.             Endif
  181.         Next
  182.         If $fFound = 0 Then
  183.             FileCopy($aSourceRekursiv[$iCounterDirCopyBackup][0] & $aSourceRekursiv[$iCounterDirCopyBackup][1],$sTarget & StringTrimLeft($aSourceRekursiv[$iCounterDirCopyBackup][0] & $aSourceRekursiv[$iCounterDirCopyBackup][1],StringLen($sSource)),9)
  184.         Else
  185.             Local $fFound = 0
  186.         EndIf
  187.     Next
  188.     Return $aSourceRekursiv[0][0]
  189.     _Crypt_Shutdown()
  190. EndFunc
  191. MsgBox(0,"",_DirCopyBackup(FileSelectFolder("Source",""),FileSelectFolder("Target",""),FileSelectFolder("Backup","")))
  192. Exit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement