Что нового

Поиск файла с самой последный модификацией по дате и времени

teges

Знающий
Сообщения
18
Репутация
16
Довольно примитивен в плане расчета времени. Возвращает имя файла
Код:
Dim $i = 0
Dim $iD = 0
Dim $file_time_max = 0
Dim $file_time[1], $file_name[1]

;~ Заносим файлы в массив
;~ FileChangeDir("Screenshots") ; Папка, где необходимо выполнить поиск
;~ Типы искомых файлов. 
$search = FileFindFirstFile("*.*") ; В данном режиме показывает и папки

If $search = -1 Then
    MsgBox(0, "Error", "Файлы по заданным параметрам не найдены")
    Exit
EndIf

While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
;~ Ищем iD нужного файла
	$time = FileGetTime($file)
	$file_name[$i] = $file
	$file_time[$i] = _time($time)
	If $file_time[$i] > $file_time_max  Then
		$file_time_max = $file_time[$i]
		$iD = $i
	EndIf
	$i += 1
;~ Наращиваем массив
	ReDim $file_time[$i+1]
	ReDim $file_name[$i+1]
WEnd
;~ Закрываем поиск
FileClose($search)

$new_file = $file_name[$iD]

MsgBox(0, "Файл обнаружен!", "Самый новый файл: " & $new_file)

;~ Расситываем время по секундам
Func _time($_time)
		$_time = $_time[0] * 31556926 + $_time[1] * 2629743.83 + $_time[2] * 84600 + $_time[3]*3600 + $_time[4] * 60 + $_time[5]
		Return $_time
EndFunc

Может кому понадобится. Есть идеи как улучшить?
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Я бы сделал так:

Код:
#Include <Array.au3>
#Include <File.au3>

$inputDir = @WindowsDir
$fileList = _FileListToArray($inputDir, '*', 1)
If IsArray($fileList) And $fileList[0] > 0 Then
	Dim $aTmp[UBound($fileList)][2]
	For $i = 1 To $fileList[0]
		$aTmp[$i][1] = $inputDir & '\' & $fileList[$i]
		$aTmp[$i][0] = FileGetTime($aTmp[$i][1], 0, 1)
	Next
	_ArraySort($aTmp, 1, 1)
	MsgBox(0, "", "Самый новый файл: " & $aTmp[1][1])
EndIf
 
Автор
T

teges

Знающий
Сообщения
18
Репутация
16
спасибо, а то у меня все, как обычно, на коленке делалось :smile: :IL_AutoIt_1:
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
teges

Аналогично, только сортировку убрал, на неё время тратится. И бывает результат разный, причина - файлы с одинаковым временем изменения могут быть несколько. Посмотри ещё Create_list_files там есть варианты результатов и получить список в виде таблицы сортированной по заказу.

Код:
#Include <Array.au3>
#Include <File.au3>
$timer = TimerInit()
$inputDir = @SystemDir
$fileList = _FileListToArray($inputDir, '*', 1)
If IsArray($fileList) And $fileList[0] > 0 Then
    Dim $aTmp[UBound($fileList)]
    For $i = 1 To $fileList[0]
        $aTmp[$i]= FileGetTime($inputDir & '\' & $fileList[$i], 0, 1)
    Next
	$ind=_ArrayMaxIndex($aTmp, 1, 1)
	MsgBox(0,'Время выполнения : '&Round(TimerDiff($timer) / 1000, 2) & ' сек', "Самый новый файл: " &$fileList[$ind])
EndIf
 

madmasles

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

$iStart = TimerInit()
$sDir = @SystemDir
$iIndex = 0
$iTime = 0
$iTimeOld = 0
$aFileList = _FileListToArray($sDir, '*', 1)
If Not @error Then
	For $i = 1 To $aFileList[0]
		$iTime = FileGetTime($sDir & '\' & $aFileList[$i], 0, 1)
		If $iTimeOld < $iTime Then
			$iTimeOld = $iTime
			$iIndex = $i
		EndIf
	Next
	MsgBox(0, 'Время выполнения : ' & Round(TimerDiff($iStart), 2) & ' ms', "Самый новый файл: " & $aFileList[$iIndex])
EndIf
 

drugsextra

Новичок
Сообщения
11
Репутация
0
подскажите как сделать с помощью этого скрипта не только поиск в указанной директории, а ещё и в папках, которые находятся этой директории?
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
drugsextra
Использовать одну из функций рекурсивного вызова. Скачать справку и скопировать UDF из Include в свой AutoIt3\Include и использовать одну из этих функций
Эту например - _FO_FileSearch
 
Верх