﻿#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=NetWorkCopy.exe
#AutoIt3Wrapper_Res_Description=NetWorkCopy
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_LegalCopyright=Oscar (www.autoit.de)
#AutoIt3Wrapper_Res_Language=1031
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Date.au3>
#include <File.au3>
#include <FileConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiStatusBar.au3>
#include <WinAPIFiles.au3>

Opt('GUIOnEventMode', 1)

Global $sTitle = 'NetWorkCopy'
Global $sVersion = '1.0.0.0'
Global $sDate = '09.08.2016'

Global $iCopyInterval = 2 ; Wann soll kopiert werden (alle X Minuten)
Global $iDeleteDays = 30  ; Nach wieviel Tagen sollen die Dateien in den Zielverzeichnissen gelöscht werden
Global $iSectionCount = 2 ; Anzahl der Abteilungen
Global $iMaxCopyItems = 1000 ; maximale Anzahl an Einträgen in der Kopierliste

Global $aSourceDir[$iSectionCount] ; Array für die Quellverzeichnisse erstellen
$aSourceDir[0] = 'c:\scanner\Abteilung1' ; <- Quellverzeichnis 1 (Index 0) festlegen
$aSourceDir[1] = 'c:\scanner\Abteilung2' ; <- Quellverzeichnis 2 (Index 1) festlegen
;~ $aSourceDir[2] = ''
;~ $aSourceDir[3] = ''
; ...

Global $aDestDir[$iSectionCount] ; Array für die Zielverzeichnisse erstellen
$aDestDir[0] = 'm:\Verzeichnis\U-Verzeichnis\U-Verzeichnis\U-Verzeichnis\Scans' ; <- Zielverzeichnis 1 (Index 0) festlegen
$aDestDir[1] = 'm:\Verzeichnis\U-Verzeichnis\U-Verzeichnis\U-Verzeichnis\Scans' ; <- Zielverzeichnis 2 (Index 1) festlegen
;~ $aDestDir[2] = ''
;~ $aDestDir[3] = ''
; ...


Global $hGui = GUICreate(StringFormat('%s v%3.3s', $sTitle, $sVersion), 640, 480) ; Fenster erstellen
GUISetIcon('shell32.dll', 19) ; Icon für das Fenster festlegen
GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseGui') ; Funktion die beim schließen des Fensters aufgerufen wird

GUICtrlCreateLabel('Ausgeführte Kopiervorgänge:', 15, 5, 240, 25) ; Label erstellen
GUICtrlSetFont(-1, 14, 400, 0, 'Arial', 5) ; Schriftart und -größe für das Label

Global $idCopylist = GUICtrlCreateListView('Datum/Zeit|Quelle|Ziel', 10, 30, 620, 420) ; Listview erstellen
_GUICtrlListView_SetColumnWidth($idCopylist, 0, 140) ; Breite der einzelnen Spalten festlegen
_GUICtrlListView_SetColumnWidth($idCopylist, 1, 220)
_GUICtrlListView_SetColumnWidth($idCopylist, 2, 220)

Global $aParts[2] = [570, -1] ; 2 Spalten für die Statuszeile
Global $hStatus = _GUICtrlStatusBar_Create($hGui) ; Statuszeile erstellen
_GUICtrlStatusBar_SetParts($hStatus, $aParts) ; Spalten festlegen
_GUICtrlStatusBar_SetText($hStatus, ' Bereit.', 0) ; und den Text in die Spalten eintragen
_GUICtrlStatusBar_SetText($hStatus, _NowTime(5), 1)

GUISetState(@SW_SHOW, $hGui) ; das Fenster anzeigen

Global $aFileList, $iRet, $iSecond = 0, $iToday = 0, $iItemCount = 0 ; ein paar zusätzliche Variablen
Global $iTimer = TimerInit() ; einen Timer initialisieren (für die Intervallzeit)

While Sleep(100) ; im OnEventMode muss hier ein Sleep stehen, damit die Prozessorlast reduziert wird
	If TimerDiff($iTimer) > $iCopyInterval * 60 * 1000 Then ; wenn die Intervallzeit (in Millisekunden) erreicht ist, dann...
		_GUICtrlStatusBar_SetText($hStatus, ' Kopiere Dateien. Bitte warten...', 0) ; Meldung in der Statuszeile anzeigen
		For $iSection = 0 To $iSectionCount - 1 ; die einzelnen Quellverzeichnisse (Abteilungen) durchgehen
			$aFileList = _FileListToArray($aSourceDir[$iSection], '*', $FLTA_FILES, True) ; alle Dateinamen einlesen
			If Not @error Then ; wenn kein Fehler aufgetreten ist, dann...
				For $i = 1 To $aFileList[0] ; Schleife, um alle Dateinamen durchzugehen
					If Not _WinAPI_FileInUse($aFileList[$i]) Then ; wenn die Datei nicht gelockt ist, dann...
						$iRet = FileCopy($aFileList[$i], $aDestDir[$iSection]) ; die Datei ins Zielverzeichnis kopieren
						If $iRet Then ; wenn die Datei erfolgreich kopiert wurde, dann...
							FileDelete($aFileList[$i]) ; die Datei im Quellverzeichnis löschen
							; und einen Eintrag in der Kopierliste erstellen
							GUICtrlCreateListViewItem(StringFormat('%s|%s|%s', _NowCalc(), $aFileList[$i], $aDestDir[$iSection]), $idCopylist)
						EndIf
					EndIf
				Next
			EndIf
		Next
		$iTimer = TimerInit() ; Timer neu initialisieren
		_GUICtrlStatusBar_SetText($hStatus, ' Bereit.', 0) ; Statuszeile auf 'Bereit' setzen
	EndIf
	If @SEC <> $iSecond Then ; wenn eine neue Sekunde angefangen hat, dann...
		$iSecond = @SEC ; die neue Sekunde merken
		_GUICtrlStatusBar_SetText($hStatus, _NowTime(5), 1) ; und die Uhrzeit in der Statuszeile aktualisieren
	EndIf
	If @MDAY <> $iToday Then ; wenn ein neuer Tag angefangen hat, dann...
		$iToday = @MDAY ; den neuen Tag merken
		_GUICtrlStatusBar_SetText($hStatus, ' Zielverzeichnisse werden aufgeräumt. Bitte warten...', 0) ; Meldung in der Statuszeile anzeigen
		For $iSection = 0 To $iSectionCount - 1 ; die einzelnen Zielverzeichnisse (Abteilungen) durchgehen
			If $aDestDir[$iSection] <> '' Then ; wenn ein Zielverzeichnis eingetragen wurde, dann...
				_FileDeleteAfterXDays($aDestDir[$iSection], $iDeleteDays) ; die alten Dateien aus dem Zielverzeichnis löschen
			EndIf
		Next
		_GUICtrlStatusBar_SetText($hStatus, ' Bereit.', 0) ; Statuszeile auf 'Bereit' setzen
	EndIf
	$iItemCount = _GUICtrlListView_GetItemCount($idCopylist)
	_GUICtrlListView_EnsureVisible($idCopylist, $iItemCount - 1)
	If $iItemCount > $iMaxCopyItems Then ; wenn die Anzahl der Einträge in der Kopierliste größer ist, als die Vorgabe, dann...
		_GUICtrlListView_DeleteItem($idCopylist, 0) ; den ersten/ältesten Eintrag löschen
	EndIf
WEnd

Func _CloseGui()
	If MsgBox(4 + 32 + 256, $sTitle, 'Soll das Programm wirklich beendet werden?', 0, $hGui) = 7 Then Return
	Exit
EndFunc   ;==>_CloseGui


;===============================================================================
; Function Name:   _FileDeleteAfterXDays($sPath, $iDays[, $bForceDel][, $bRek][, $bDirDel][, $bLog])
; Description::    löscht Dateien in einem ausgewähltem Verzeichnis (rekursiv)
;                  nach einer angegebenen Anzahl von Tagen
; Parameter(s):    $sPath = Verzeichnis, aus dem die Dateien gelöscht werden sollen.
;                  $iDays = Dateien, die älter als $iDays (in Tagen) sind, löschen.
;                  $bForceDel = wenn "True" werden auch Dateien/Verzeichnisse gelöscht,
;                               die gegen löschen geschützt sind ("R"-Attribut)
;                  $bRek = wenn "True" wird das Verzeichnis rekursiv (inkl. Unter-
;                          verzeichnisse) durchsucht.
;                  $bDirDel = wenn "True" wird das Unterverzeichnis gelöscht, wenn
;                             es (aufgrund der Löschaktion) leer ist.
;                  $bLog = wenn "True" wird das Ergebnis der Löschaktion in die
;                          Console geschrieben.
; Requirement(s):  AutoIt-Version v3.3.14.2
;                  #include <Date.au3>
; Return Value(s): bei Erfolg Rückgabe = 1
;                  bei Fehler Rückgabe = 0
;                  und @error:
;                  1 = $iDays ist keine oder eine negative Zahl
;                  2 = Das übergebene Verzeichnis existiert nicht oder ist leer.
; Author(s):       Oscar (www.autoit.de)
;                  Micha_he (www.autoit.de)
;===============================================================================
Func _FileDeleteAfterXDays($sPath, $iDays, $bForceDel = False, $bRek = False, $bDirDel = False, $bLog = True)
	Local $hSearchm, $hEmpty, $sFile, $sDate, $iRet
	If (Not IsNumber($iDays)) Or ($iDays < 0) Then Return SetError(1, 0, 0)
	If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
	$hSearch = FileFindFirstFile($sPath & '*.*')
	If @error Then Return SetError(2, 0, 0)
	While 1
		$sFile = FileFindNextFile($hSearch)
		If @error Then ExitLoop
		If @extended Then
			If $bRek Then
				_FileDeleteAfterXDays($sPath & $sFile, $iDays, $bForceDel, $bRek, $bDirDel, $bLog)
				If $bDirDel Then
					$hEmpty = FileFindFirstFile($sPath & $sFile & '\*.*')
					If @error Then
						If $bForceDel Then FileSetAttrib($sPath & $sFile, '-R')
						$iRet = DirRemove($sPath & $sFile)
						If $bLog Then ConsoleWrite('Folder "' & $sPath & $sFile & '" deleted = ' & ($iRet ? 'yes' : 'no') & @CR)
					EndIf
					FileClose($hEmpty)
				EndIf
			EndIf
		Else
			$sDate = StringRegExpReplace(FileGetTime($sPath & $sFile, 0, 1), '(\d{4})(\d{2})(\d{2})(.*)', '$1/$2/$3')
			If _DateDiff('D', $sDate, _NowCalc()) > $iDays Then
				If $bForceDel Then FileSetAttrib($sPath & $sFile, '-R')
				$iRet = FileDelete($sPath & $sFile)
				If $bLog Then ConsoleWrite('File "' & $sPath & $sFile & '" deleted = ' & ($iRet ? 'yes' : 'no') & @CR)
			EndIf
		EndIf
	WEnd
	FileClose($hSearch)
	Return 1
EndFunc   ;==>_FileDeleteAfterXDays
