Что нового

[Время, дата] Поиск самой "юной" папки

alexnasa

Новичок
Сообщения
50
Репутация
0
Версия AutoIt: 3

Описание:
Была такая тема: http://autoit-script.ru/index.php/topic,498.30.html Работает код, спасибо и автору и тем, кто код писал- правил.
Однако похожая задача возникла. Нужно обыскать текущий директорий на предмет самой юной папки в нем и записать в текстовик, её (самой юной папки) листинг- список её содержимого (с датами файлов). Заранее благодарен всем!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
alexnasa,
Попробуйте так.
Код:
#include <File.au3>
#include <Array.au3>

$sDir_Where_Search = @DesktopDir
$sFile_To_Write = @ScriptDir & '\Youngest_Folder.txt'
$sYoungest_Folder = ''
$sTime = ''

$aTemp = _FileListToArray($sDir_Where_Search, '*', 2)
If @error Then Exit 13
Dim $aDir_and_Time[$aTemp[0] + 1][2] = [[$aTemp[0]]]
For $i = 1 To $aDir_and_Time[0][0]
	$aDir_and_Time[$i][0] = $aTemp[$i]
	$aDir_and_Time[$i][1] = FileGetTime($sDir_Where_Search & '\' & $aTemp[$i], 1, 1)
Next
$aTemp = 0
_ArraySort($aDir_and_Time, 1, 1, 0, 1)
For $i = 1 To $aDir_and_Time[0][0]
	If $aDir_and_Time[$i][1] Then
		$sYoungest_Folder = $sDir_Where_Search & '\' & $aDir_and_Time[$i][0]
		$sTime = StringRegExpReplace($aDir_and_Time[$i][1], '^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})', '$3.$2.$1 $4:$5:$6')
		ExitLoop
	EndIf
Next
If $sYoungest_Folder Then
	$aTemp = _FileListToArray($sYoungest_Folder)
	If @error Then Exit 13
	$sYoungest_Folder &= @TAB & 'Created: ' & $sTime & @CRLF
	For $i = 1 To $aTemp[0]
		$sYoungest_Folder &= $aTemp[$i] & @CRLF
	Next
	$hFile = FileOpen($sFile_To_Write, 2)
	If $hFile = -1 Then Exit 13
	FileWrite($hFile, StringTrimRight($sYoungest_Folder, 2))
	FileClose($hFile)
Else
	ConsoleWrite('error' & @LF)
EndIf
 
Автор
alexnasa

alexnasa

Новичок
Сообщения
50
Репутация
0
Работает! ..Сейчас поправлю @DesktopDir на @ScriptDir
А еще- можно ли не только имена файлов в листинге, но и даты создания? Т.е. _FileListToArray создаёт список файлов и/или папок указанного пути подобно использованию Dir с параметром /B , а мне надо как раз без ключа "/B"
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Время, дата] Поиск самой \\\"юной\\\" папки

alexnasa [?]
Вам надо в Стол заказов
Оформите тему в соответствии с Правилами обязательного оформления тем. и я ее туда перенесу.


Добавлено:
Сообщение автоматически объединено:

alexnasa [?]
по поводу свежести даты
Исправил.



Добавлено:
Сообщение автоматически объединено:

alexnasa [?]
можно ли не только имена файлов в листинге, но и даты создания?
Попробуйте так.
Код:
#include <File.au3>
#include <Array.au3>

$sDir_Where_Search = @DesktopDir
$sFile_To_Write = @ScriptDir & '\Youngest_Folder.txt'
$sYoungest_Folder = ''
$sTime = ''
$sText = ''

$aTemp = _FileListToArray($sDir_Where_Search, '*', 2)
If @error Then Exit 13
Dim $aDir_and_Time[$aTemp[0] + 1][2] = [[$aTemp[0]]]
For $i = 1 To $aDir_and_Time[0][0]
	$aDir_and_Time[$i][0] = $aTemp[$i]
	$aDir_and_Time[$i][1] = FileGetTime($sDir_Where_Search & '\' & $aTemp[$i], 1, 1)
Next
$aTemp = 0
_ArraySort($aDir_and_Time, 1, 1, 0, 1)
For $i = 1 To $aDir_and_Time[0][0]
	If $aDir_and_Time[$i][1] Then
		$sYoungest_Folder = $sDir_Where_Search & '\' & $aDir_and_Time[$i][0]
		$sTime = StringRegExpReplace($aDir_and_Time[$i][1], '^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$', '$3.$2.$1 $4:$5:$6')
		ExitLoop
	EndIf
Next
If $sYoungest_Folder Then
	$sText = $sYoungest_Folder & @TAB & 'Created: ' & $sTime & @CRLF
	$aTemp = _FileListToArray($sYoungest_Folder)
	Switch @error
		Case 4
			$sText &= 'Empty Folder' & @CRLF
		Case 0
			For $i = 1 To $aTemp[0]
				$sText &= $aTemp[$i] & @TAB & 'Created: ' & _
						StringRegExpReplace(FileGetTime($sYoungest_Folder & '\' & $aTemp[$i], 1, 1), _
						'^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$', '$3.$2.$1 $4:$5:$6') & @CRLF
			Next
		Case Else
			Exit 13
	EndSwitch
	$aTemp = 0
	$hFile = FileOpen($sFile_To_Write, 2)
	If $hFile = -1 Then Exit 13
	FileWrite($hFile, StringTrimRight($sText, 2))
	FileClose($hFile)
Else
	ConsoleWrite('error' & @LF)
EndIf
 
Автор
alexnasa

alexnasa

Новичок
Сообщения
50
Репутация
0
Огромное спасибо! Работает! Даже по телнет работает!! Т.е. я могу удалённо из батника запускать этот код и получать "тамошние" свежие отчёты-текстовики! Маленькая просьба, очень надо "перевернуть" в полученном списке строки так, что бы список файлов в нем начинался с самых "юных" файлов, и далее по убыванию даты перечень шел (сейчас список начинается с самых "древних"), и кроме поля "Created:" (после него) еще и размер файла было видно.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
alexnasa,
Тестируйте.
Код:
#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
 
Верх