Что нового

Определить один самый новый файл в подпапках

Svet89

Новичок
Сообщения
5
Репутация
0
Доброго времени суток всем!
Помогите доработать скрипт по определению самого нового файла в подпапках. С 3 уровнями вложений. Файлов в итоге будет не так много. В общей сумме 365.
Есть скрипт для определения только в папке без подпапок, а вот как его доработать с подпапками не соображу...
Код:
#Include <File.au3>
#Include <Array.au3>

$timer = TimerInit()
$inputDir4 = "C:"									; Путь к папке
$fileList4 = _FileListToArray($inputDir4, '*', 1)

If IsArray($fileList4) And $fileList4[0] > 0 Then
   Dim $nf4[UBound($fileList4)][3]
	  For $i = 1 To $fileList4[0]
		 $nf4[$i][2] = $inputDir4 & '\' & $fileList4[$i]
		 $nf4[$i][1] = $fileList4[$i]
		 $nf4[$i][0] = FileGetTime($nf4[$i][2], 0, 1)
	  Next
   _ArraySort($nf4, 2, 1)
If Not @error Then
   $td4 = FileGetTime($nf4[1][2])
   $size4 = (Round (FileGetSize($nf4[1][2]) / 1048576, 2)) & " Mb"
   $result4 = $td4[2] & "." & $td4[1] & "." & $td4[0] & "    " & $td4[3] & ":" & $td4[4]
   MsgBox(0, "", $nf4[1][1] & @TAB & $result4 & @TAB & @TAB & $size4)
EndIf
EndIf

GUISetState(@SW_SHOW)
while 1
    $msj = Guigetmsg()
    switch $msj
        case -3
            Exit
    EndSwitch
 WEnd
 
Автор
S

Svet89

Новичок
Сообщения
5
Репутация
0
AZJIO

Большое спасибо! Не думала что все будет настолько просто! :whistle:
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Svet89

Сортировка занимает значительное время, проще прогнать цикл по списку вычисляя последнее наибольшее время, так быстрее. Принцип тот же как я сделал "найти наибольший файл" в _GetMaxFile, в примере в конце.


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

Svet89

Используется версия AutoIt 3.3.8.1, на новых версиях FileOperations.au3 не работает и придётся переделывать параметры.

1. Получение одного файла.
Код:
#include <FileOperations.au3>
#include <Array.au3>

$sNewFile = _GetNewFile(@AppDataDir, '*.exe')
; $sNewFile = _GetNewFile(@ProgramFilesDir, '*.exe')
If Not @error Then
	$info = ''
	$info &= 'Файл = ' & @TAB & $sNewFile & @CR
	$tmp = FileGetTime($sNewFile)
	$info &= 'Дата = ' & @TAB & $tmp[2] & '.' & $tmp[1] & '.' & $tmp[0] & '    ' & $tmp[3] & ':' & $tmp[4] & @CR
	$info &= 'Размер = ' & @TAB & _FO_ShortFileSize(FileGetSize($sNewFile))
	MsgBox(0, 'Сообщение', $info)
EndIf

Func _GetNewFile($sPath, $sMask)
	Local $aFileList = _FO_FileSearch($sPath, $sMask)
	If @error Then SetError(1)
	Local $iTime = 0, $inum = '', $iTimeTmp
	For $i = 1 To $aFileList[0]
		$iTimeTmp = FileGetTime($aFileList[$i], 0, 1)
		If $iTimeTmp > $iTime Then
			$inum = $i
			$iTime = $iTimeTmp
		EndIf
	Next
	Return $aFileList[$inum]
EndFunc   ;==>_GetNewFile

2. Получение указанного количества новых файлов.
Код:
#include <FileOperations.au3>
#include <Array.au3>

$sNewFile = _ArrGetNewFile(@AppDataDir, '*.exe', 10)
; $aFileList = _ArrGetNewFile(@ProgramFilesDir, '*.exe', 10)

If Not @error Then
	For $i = 1 To $aFileList[0][0]
		$tmp = FileGetTime($aFileList[$i][0])
		$aFileList[$i][1] = $tmp[2] & '.' & $tmp[1] & '.' & $tmp[0] & '    ' & $tmp[3] & ':' & $tmp[4]
		$aFileList[$i][2] = _FO_ShortFileSize(FileGetSize($aFileList[$i][0]))
	Next
EndIf
_ArrayDisplay($aFileList)

Func _ArrGetNewFile($sPath, $sMask, $iNun)
	Local $aFileList = _FO_FileSearch($sPath, $sMask)
	If @error Then SetError(1)
	Local $aFileList_2D[$aFileList[0] + 1][2]
	For $i = 1 To $aFileList[0]
		$aFileList_2D[$i][0] = $aFileList[$i]
		$aFileList_2D[$i][1] = FileGetTime($aFileList[$i], 0, 1)
	Next
	ReDim $aFileList_2D[$aFileList[0] + 1][3]
	_ArraySort($aFileList_2D, 1, 1, $aFileList[0], 1)
	If @error Then SetError(1)
	ReDim $aFileList_2D[$iNun + 1][3]
	$aFileList_2D[0][0] = $iNun
	Return $aFileList_2D
EndFunc   ;==>_ArrGetNewFile

А вообще если не стоит вопрос программного поиска, то можно воспользоваться готовой программой Create_list_files. Добавляете колонку даты изменения, пути, указать сортировку по убыванию по дате изменения, в итоге на выходе будет список всех файлов из которого видно когда что появилось. Удобно находить вирусы по маске "exe" в "AppData"
 
Автор
S

Svet89

Новичок
Сообщения
5
Репутация
0
AZJIO

В принципе алгоритм определения может быть и другой совершенно. Не как первоначальный.
И что то я окончательно запуталась во всем :smile: вариант без дополнительных текстовых файлов возможен? Или только по аналогии с Create_list_files?

Ваши примеры кстати работаю практически такое же время как и первый решенный вариант. И что нужно переделать в них чтобы работало на последних версиях?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Svet89 [?]
И что нужно переделать в них чтобы работало на последних версиях?
Использовать _FileListToArrayRec и _ArraySort проверить параметры.
И что то я окончательно запуталась во всем
Дело в следующем для меньших головных болей мы сортируем список файлов и берём из массива верхний, при этом разница в скорости взависимости от количества файлов не играет особой роли. Но для любителей вылизывать скрипт и делать его правильным, то есть работать над красотой скрипта, очевидно, что скрипт делает лишнюю работу, сортировка списка файлов затратная операция, зачем переписывать пути во всём массиве сравнивая все значения, если нам важен один единственный путь, мы не сортируем список, мы ищем в нём наибольшую дату. Кстати _ArrayMaxIndex сейчас работает с 2D массивами, можно даже его использовать, то есть найти во второй колонке наибольшее число и получить индекс используя индекс взять из массива путь в первой колонке.
Второе, а что если появились сразу 2 файла и инфа недостаточно точна, поэтому я до кучи сделал поиск последних новых файлов в заданном количестве. В идеале этот скрипт не идеален, тем что как раз опять же сортирует список, когда правильнее будет сравнивать очередной файл с самым старым из новых, и смотря при каком соотношении числа искомых к числу существующих.
 
Верх