; ----------------------------------------------------------------------------
;
; AutoIt Version: 3.2.4.0
; Author:         bernd670
; Impulse:        Alina
;
; Script Function:
;	File Splitting
;
; ----------------------------------------------------------------------------
#Region Compiler directives section
#Compiler_Prompt=y
#Compiler_Res_Language=1031
#Compiler_Icon=
#Compiler_Res_LegalCopyright=bernd670 and Friends
#Compiler_Res_Description=AutoIt v3 Skript - File Splitting
#Compiler_Res_Comment=File Splitting
#Compiler_OutFile_Type=exe
#Compiler_Compression=4                	  ;Compression parameter 0-4  0=Low 2=normal 4=High
#Compiler_Allow_Decompile=n
#Compiler_Res_Field=Entwickler|bernd670
#Compiler_Res_Field=Release Datum|%date% %time%
#Compiler_Res_Field=Programmgruppe|Tools
#Compiler_Res_Field=Original Dateiname|FileSplit.exe
#Compiler_Res_Field=Version|1.0
#Compiler_Run_Obfuscator=n
#EndRegion

#include <GUIConstants.au3>
#include <File.au3>

Opt("GUIOnEventMode", 1)

Global $bFileOK = False
Global $bSplitSizeOK = False

#Region ### START Koda GUI section ### Form=D:\Entwicklung\AutoIt3\MyExamples\Forum\Users\Alina\Filesplit\FrmFileSplit.kxf
$FrmFileSplit = GUICreate("Datei splitten", 478, 203, -1, -1)
GUISetFont(10, 400, 0, "Arial")
GUISetOnEvent($GUI_EVENT_CLOSE, "FrmFileSplitClose")
GUISetOnEvent($GUI_EVENT_MINIMIZE, "FrmFileSplitMinimize")
GUISetOnEvent($GUI_EVENT_MAXIMIZE, "FrmFileSplitMaximize")
GUISetOnEvent($GUI_EVENT_RESTORE, "FrmFileSplitRestore")
$LblFile = GUICtrlCreateLabel("Datei:", 32, 24, 38, 20)
GUICtrlSetOnEvent(-1, "LblFileClick")
$IBFile = GUICtrlCreateInput("", 76, 22, 220, 24)
GUICtrlSetOnEvent(-1, "IBFileChange")
$ButFileSearch = GUICtrlCreateButton("&Durchsuchen...", 304, 19, 145, 30)
GUICtrlSetOnEvent(-1, "ButFileSearchClick")
$LblSplit = GUICtrlCreateLabel("Teilen in max.", 32, 66, 85, 20)
GUICtrlSetOnEvent(-1, "LblSplitClick")
$IBSplit = GUICtrlCreateInput("", 120, 64, 176, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
GUICtrlSetOnEvent(-1, "IBSplitChange")
$CBSplitSize = GUICtrlCreateCombo("", 304, 64, 145, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "Teile|Bytes|KBytes (x 1.024)|MBytes (x 1.048.576)", "Teile")
GUICtrlSetOnEvent(-1, "CBSplitSizeChange")
$CBMerge = GUICtrlCreateCheckbox("Batchdatei zum Zusammenfügen generieren", 32, 108, 275, 17)
GUICtrlSetOnEvent(-1, "CBMergeClick")
$ButSplit = GUICtrlCreateButton("&Splitten", 236, 150, 100, 30)
GUICtrlSetOnEvent(-1, "ButSplitClick")
GUICtrlSetState(-1, $GUI_DISABLE)
$ButCancel = GUICtrlCreateButton("&Beenden", 349, 150, 100, 30)
GUICtrlSetOnEvent(-1, "ButCancelClick")
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form=D:\Entwicklung\AutoIt3\MyExamples\Forum\Users\Alina\Filesplit\FrmProgress.kxf
$FrmProgress = GUICreate("Splitten...", 352, 105, 240, 198, BitOR($WS_DLGFRAME, $WS_POPUP, $WS_CLIPSIBLINGS), -1, $FrmFileSplit)
GUISetFont(10, 400, 0, "Arial")
GUISetOnEvent($GUI_EVENT_CLOSE, "FrmProgressClose")
GUISetOnEvent($GUI_EVENT_MINIMIZE, "FrmProgressMinimize")
GUISetOnEvent($GUI_EVENT_MAXIMIZE, "FrmProgressMaximize")
GUISetOnEvent($GUI_EVENT_RESTORE, "FrmProgressRestore")
$LblCount = GUICtrlCreateLabel("", 24, 20, 100, 20)
GUICtrlSetOnEvent(-1, "LblCountClick")
$LblFileName = GUICtrlCreateLabel("", 123, 20, 200, 20, $SS_RIGHT)
GUICtrlSetOnEvent(-1, "LblFileNameClick")
$PGCount = GUICtrlCreateProgress(24, 44, 300, 32, $PBS_SMOOTH)
#EndRegion ### END Koda GUI section ###

Func FrmProgressClose()
EndFunc   ;==>FrmProgressClose

Func FrmProgressMaximize()
EndFunc   ;==>FrmProgressMaximize

Func FrmProgressMinimize()
EndFunc   ;==>FrmProgressMinimize

Func FrmProgressRestore()
EndFunc   ;==>FrmProgressRestore

Func LblCountClick()
EndFunc   ;==>LblCountClick

Func LblFileNameClick()
EndFunc   ;==>LblFileNameClick


GUISetState(@SW_SHOW, $FrmFileSplit)

While 1
	If $bFileOK And $bSplitSizeOK Then
		If BitAND(GUICtrlGetState($ButSplit), $GUI_DISABLE) = $GUI_DISABLE Then GUICtrlSetState($ButSplit, $GUI_ENABLE)
	Else
		If BitAND(GUICtrlGetState($ButSplit), $GUI_ENABLE) = $GUI_ENABLE Then GUICtrlSetState($ButSplit, $GUI_DISABLE)
	EndIf
	Sleep(100)
WEnd

Func ButCancelClick()
	Exit
EndFunc   ;==>ButCancelClick

Func ButFileSearchClick()
	Local $szFileName = FileOpenDialog("Datei wählen", "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", "All (*.*)", 3)

	If Not @error Then
		GUICtrlSetData($IBFile, $szFileName)
		$bFileOK = True
	EndIf
EndFunc   ;==>ButFileSearchClick

Func ButSplitClick()
	Local $szDrive, $szDir, $szExt, $arFile, $szBatchFile = "@ECHO OFF" & @CRLF & "COPY /B "
	Local $dwFileGetSize, $szOutputDir, $dwOutSize, $dwOutCount, $dwParts
	Local $szFileName = GUICtrlRead($IBFile)
	Local $szSplitSize = GUICtrlRead($IBSplit)

	$arWGPFS = WinGetPos($FrmFileSplit)
	$arWGPPG = WinGetPos($FrmProgress)

	WinMove($FrmProgress, "", $arWGPFS[0] + Floor($arWGPFS[2] / 2) - Floor($arWGPPG[2] / 2), $arWGPFS[1] + Floor($arWGPFS[3] / 2) - Floor($arWGPPG[3] / 2))

	$arFile = _PathSplit($szFileName, $szDrive, $szDir, $szFileName, $szExt)

	If Not IsArray($arFile) Then
		MsgBox(262160, "Fehler!", "Ein schwerwigender Fehler ist aufgetreten!" & @CRLF & "Programm wird beendet!")
		Exit
	EndIf

	$szOutputDir = $szDrive & $szDir & $szFileName & "." & @YEAR & @MON & @MDAY & @HOUR & @MIN & "\"
	If Not FileExists($szOutputDir) Then DirCreate($szOutputDir)

	$dwFileGetSize = FileGetSize($arFile[0])

	$szSplitSize = StringReplace($szSplitSize, ".", "")
	$szSplitSize = StringReplace($szSplitSize, ",", ".")

	Switch GUICtrlRead($CBSplitSize)
		Case "Teile"
			$dwOutSize = Ceiling($dwFileGetSize / Floor($szSplitSize))
			$dwOutCount = Floor($szSplitSize)

		Case "Bytes"
			$dwOutSize = Floor($szSplitSize)
			$dwOutCount = Ceiling($dwFileGetSize / Floor($dwOutSize))

		Case "KBytes (x 1.024)"
			$dwOutSize = $szSplitSize * 1024
			$dwOutCount = Ceiling($dwFileGetSize / Floor($dwOutSize))

		Case "MBytes (x 1.048.576)"
			$dwOutSize = $szSplitSize * 1048576
			$dwOutCount = Ceiling($dwFileGetSize / Floor($dwOutSize))

	EndSwitch
	$dwParts = Floor($dwOutSize / 65024) ; 127*512
	$fhRead = FileOpen($arFile[0], 16)

	GUISetState(@SW_SHOW, $FrmProgress)

	For $iCount = 1 To $dwOutCount
		$szOutFileName = StringFormat("%s.%0" & StringLen($dwOutCount) & "i", $szFileName, $iCount)
		GUICtrlSetData($LblCount, StringFormat("%i / %i", $iCount, $dwOutCount))
		GUICtrlSetData($LblFileName, $szOutFileName)
		GUICtrlSetData($PGCount, 100 / $dwOutCount * $iCount)
		$szBatchFile &= $szOutFileName
		$fhWrite = FileOpen($szOutputDir & $szOutFileName, 18)
		$szBinary = FileRead($fhRead, Mod($dwOutSize, 65024))
		FileWrite($fhWrite, $szBinary)

		For $iCountPart = 1 To $dwParts
			$szBinary = FileRead($fhRead, 65024)
			FileWrite($fhWrite, $szBinary)
		Next
		FileClose($fhWrite)
		If $iCount < $dwOutCount Then $szBatchFile &= " + "
	Next

	FileClose($fhRead)

	$szBatchFile &= " " & $szFileName & $szExt

	If BitAND(GUICtrlRead($CBMerge), $GUI_CHECKED) = $GUI_CHECKED Then
		FileWrite($szOutputDir & "_Merge.bat", $szBatchFile)
	EndIf

	GUISetState(@SW_HIDE, $FrmProgress)
EndFunc   ;==>ButSplitClick

Func CBMergeClick()
EndFunc   ;==>CBMergeClick

Func CBSplitSizeChange()
EndFunc   ;==>CBSplitSizeChange

Func FrmFileSplitClose()
	Exit
EndFunc   ;==>FrmFileSplitClose

Func FrmFileSplitMaximize()
EndFunc   ;==>FrmFileSplitMaximize

Func FrmFileSplitMinimize()
EndFunc   ;==>FrmFileSplitMinimize

Func FrmFileSplitRestore()
EndFunc   ;==>FrmFileSplitRestore

Func IBFileChange()
	Local $szFileName = GUICtrlRead($IBFile)
	If Not FileExists($szFileName) Then
		$bFileOK = False
		MsgBox(262160, "Fehler!", "Datei " & Chr(34) & $szFileName & Chr(34) & @CRLF & "existiert nicht!")
		GUICtrlSetData($IBFile, "")
		Return
	EndIf
	$bFileOK = True
EndFunc   ;==>IBFileChange

Func IBSplitChange()
	Local $szSplitSize = GUICtrlRead($IBSplit)
	If Not StringRegExp($szSplitSize, "\A[0-9]+(\.[0-9]{3})*(,[0-9]+)?\z") Then ; wenn keine gültige Zahl
		$bSplitSizeOK = False
		MsgBox(262160, "Fehler!", "Ungültige Eingabe!")
		GUICtrlSetState($IBSplit, $GUI_FOCUS)
		GUICtrlSetData($IBSplit, "")
		Return
	EndIf
	$bSplitSizeOK = True
EndFunc   ;==>IBSplitChange

Func LblFileClick()
EndFunc   ;==>LblFileClick

Func LblSplitClick()
EndFunc   ;==>LblSplitClick
