#NoTrayIcon
#include <Array.au3>
Opt('MustDeclareVars', 1)
Global $aYoungest_Folder, $sDir_Where_Search, $sLogDir, $iError
Switch $CmdLine[0]
Case 0
$sDir_Where_Search = @ScriptDir
$sLogDir = @ScriptDir & '\Log'
Case 1
$sDir_Where_Search = $CmdLine[1]
$sLogDir = @ScriptDir & '\Log'
Case 2
$sDir_Where_Search = $CmdLine[1]
$sLogDir = $CmdLine[2]
If Not FileExists($sLogDir) Or Not StringInStr(FileGetAttrib($sLogDir), 'd') Then
$sLogDir = @ScriptDir & '\Log'
EndIf
EndSwitch
$aYoungest_Folder = _Get_Youngest_Folder($sDir_Where_Search)
$iError = @error
If $iError Then
__Write_Log_Error($iError, $sLogDir, $sDir_Where_Search)
Exit $iError
EndIf
__FileListToFile($aYoungest_Folder, $sLogDir)
$iError = @error
Switch $iError
Case 1 To 3
__Write_Log_Error($iError, $sLogDir, $aYoungest_Folder[0])
Case 4
__Write_Log_Error($iError, $sLogDir)
EndSwitch
Exit $iError
Func __Write_Log_Error($i_Error, $s_LogDir, $s_Path = '')
Local $a_Error[5] = ['', 'No folder: ', 'Error find files (folders) in: ', 'Empty folder: ', 'Error open log-file'], _
$s_File, $s_Text, $h_File
$s_File = StringRegExpReplace($s_LogDir, '[\\/]+\z', '') & '\ErrorLog.txt'
$s_Text = StringFormat('%02d.%02d.%04d %02d:%02d:%02d\t%s\r\n', @MDAY, @MON, @YEAR, @HOUR, @MIN, @SEC, $a_Error[$i_Error] & $s_Path)
$h_File = FileOpen($s_File, 9)
FileWrite($h_File, $s_Text)
FileClose($h_File)
EndFunc ;==>__Write_Log_Error
Func _Get_Youngest_Folder($s_Path)
Local $h_Search, $s_Dir, $s_DirList, $a_Dir, $a_Max[3], $a_Ret[4]
$s_Path = StringRegExpReplace($s_Path, '[\\/]+\z', '') & '\'
If Not FileExists($s_Path) Then Return SetError(1)
$h_Search = FileFindFirstFile($s_Path & '*')
Switch @error
Case -1
Return SetError(2)
Case 1
Return SetError(3)
EndSwitch
While 1
$s_Dir = FileFindNextFile($h_Search)
If @error Then ExitLoop
If Not @extended Then ContinueLoop
$s_DirList &= '|' & $s_Dir
WEnd
FileClose($h_Search)
If Not $s_DirList Then Return SetError(3)
$a_Dir = StringSplit(StringTrimLeft($s_DirList, 1), '|')
For $i = 1 To $a_Dir[0]
$a_Max[0] = Int(FileGetTime($s_Path & $a_Dir[$i], 1, 1))
If $a_Max[1] < $a_Max[0] Then
$a_Max[1] = $a_Max[0]
$a_Max[2] = $i
EndIf
Next
$a_Ret[0] = $s_Path
$a_Ret[1] = $s_Path & $a_Dir[$a_Max[2]]
$a_Ret[2] = $a_Max[1]
$a_Ret[3] = DirGetSize($s_Path & $a_Dir[$a_Max[2]])
Return $a_Ret
EndFunc ;==>_Get_Youngest_Folder
Func __FileListToFile($a_Path, $s_LogDir)
Local $s_Path = $a_Path[1] & '\', $h_Search, $s_File, $a_DirList[1001][3] = [[0, 1000]], $a_FileList[1001][3] = [[0, 1000]], _
$v_Len, $i_MaxLen = 11, $s_Text, $s_Format, $h_File, $s_Line, $s_Chr = Chr(151), $s_End
$h_Search = FileFindFirstFile($s_Path & '*')
Switch @error
Case -1
Return SetError(2)
Case 0
While 1
$s_File = FileFindNextFile($h_Search)
If @error Then ExitLoop
Switch @extended
Case 0
$a_FileList[0][0] += 1
If $a_FileList[0][0] = $a_FileList[0][1] Then
$a_FileList[0][1] += 1000
ReDim $a_FileList[$a_FileList[0][1] + 1][3]
EndIf
$a_FileList[$a_FileList[0][0]][0] = $s_File
$a_FileList[$a_FileList[0][0]][1] = Int(FileGetTime($s_Path & $s_File, 1, 1))
$a_FileList[$a_FileList[0][0]][2] = FileGetSize($s_Path & $s_File)
$a_FileList[0][2] += $a_FileList[$a_FileList[0][0]][2]
Case 1
$a_DirList[0][0] += 1
If $a_DirList[0][0] = $a_DirList[0][1] Then
$a_DirList[0][1] += 1000
ReDim $a_DirList[$a_DirList[0][1] + 1][3]
EndIf
$a_DirList[$a_DirList[0][0]][0] = $s_File
$a_DirList[$a_DirList[0][0]][1] = Int(FileGetTime($s_Path & $s_File, 1, 1))
$a_DirList[$a_DirList[0][0]][2] = DirGetSize($s_Path & $s_File)
$a_DirList[0][2] += $a_DirList[$a_DirList[0][0]][2]
EndSwitch
$v_Len = StringLen($s_File)
If $i_MaxLen < $v_Len Then $i_MaxLen = $v_Len
WEnd
FileClose($h_Search)
EndSwitch
ReDim $a_FileList[$a_FileList[0][0] + 1][3]
ReDim $a_DirList[$a_DirList[0][0] + 1][3]
If $a_FileList[0][0] Then _ArraySort($a_FileList, 1, 1, 0, 1)
If $a_DirList[0][0] Then _ArraySort($a_DirList, 1, 1, 0, 1)
For $i = 1 To 46 + $i_MaxLen
$s_Line &= $s_Chr
Next
If Not $a_FileList[0][0] And Not $a_DirList[0][0] Then
$s_Text = StringFormat('In folder: %s\r\nLast created folder: %s\r\nCreated: %s\r\nEmpty folder\r\n', $a_Path[0], $a_Path[1], _TimeFormat($a_Path[2]))
Else
$s_Text = StringFormat('In folder: %s\r\nLast created folder: %s\r\nCreated: %s\r\nSize (bytes): %s\r\n\r\nList:\r\n\r\n', $a_Path[0], $a_Path[1], _
_TimeFormat($a_Path[2]), StringRegExpReplace($a_Path[3], '(\A\d{1,3}(?=(\d{3})+\z)|\d{3}(?=\d))', '$1 '))
$s_Format = '| %-' & $i_MaxLen + 1 & 's| %-20s|%18s |\r\n'
$s_Text &= $s_Line & @CRLF
$v_Len = ''
For $i = 1 To Int($i_MaxLen / 2) - 2
$v_Len &= ' '
Next
$v_Len &= 'Name'
$s_Text &= StringFormat($s_Format & '%s\r\n', $v_Len, ' Created', 'Size (bytes) ', $s_Line)
If $a_DirList[0][0] Then
$v_Len = ''
For $i = 1 To Int(($i_MaxLen + 44) / 2) - 4
$v_Len &= ' '
Next
$v_Len &= 'Folders:'
$s_Text &= StringFormat('|%-' & 44 + $i_MaxLen & 's|\r\n%s\r\n', $v_Len, $s_Line)
For $i = 1 To $a_DirList[0][0]
$s_Text &= StringFormat($s_Format, $a_DirList[$i][0], _TimeFormat($a_DirList[$i][1]), _
StringRegExpReplace($a_DirList[$i][2], '(\A\d{1,3}(?=(\d{3})+\z)|\d{3}(?=\d))', '$1 '))
Next
$s_End &= @CRLF & 'Folders: ' & $a_DirList[0][0] & ', Size: ' & StringRegExpReplace($a_DirList[0][2], '(\A\d{1,3}(?=(\d{3})+\z)|\d{3}(?=\d))', '$1 ') & ' bytes'
EndIf
If $a_FileList[0][0] Then
If $a_DirList[0][0] Then $s_Text &= $s_Line & @CRLF
$v_Len = ''
For $i = 1 To Int(($i_MaxLen + 44) / 2) - 3
$v_Len &= ' '
Next
$v_Len &= 'Files:'
$s_Text &= StringFormat('|%-' & 44 + $i_MaxLen & 's|\r\n%s\r\n', $v_Len, $s_Line)
For $i = 1 To $a_FileList[0][0]
$s_Text &= StringFormat($s_Format, $a_FileList[$i][0], _TimeFormat($a_FileList[$i][1]), _
StringRegExpReplace($a_FileList[$i][2], '(\A\d{1,3}(?=(\d{3})+\z)|\d{3}(?=\d))', '$1 '))
Next
$s_End &= @CRLF & 'Files: ' & $a_FileList[0][0] & ', Size: ' & StringRegExpReplace($a_FileList[0][2], '(\A\d{1,3}(?=(\d{3})+\z)|\d{3}(?=\d))', '$1 ') & ' bytes'
EndIf
EndIf
$s_Text &= $s_Line & $s_End
$h_File = FileOpen(StringRegExpReplace($s_LogDir, '[\\/]+\z', '') & '\' & StringRegExpReplace($a_Path[1], '^.*\\', '') & '.txt', 10)
If $h_File = -1 Then Return SetError(4)
FileWrite($h_File, $s_Text)
FileClose($h_File)
Return
EndFunc ;==>__FileListToFile
Func _TimeFormat($i_Time)
If Not IsInt($i_Time) Then Return 'Unknown'
If StringLen($i_Time) <> 14 Then Return 'Unknown'
Return StringRegExpReplace($i_Time, '^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$', '$3.$2.$1 $4:$5:$6')
EndFunc ;==>_TimeFormat