Что нового

[Автоматизация] top10 новых файлов в директории

komorov74

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

Описание:
Добрейшего дня.
В принципе нужно мониторить на появления новых файлов в определенной директории.
Результаты записывать в два текстовых файла (путь и дату с временим)
первый TOP100 по времени
второй TOP100 по размеру (размер на зависит от времени создания файла)
сканировать раз в сутки


Примечания:
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
komorov74
Поясните, что конкретно требуется - раз в сутки сканировать папку и создавать 2 лога - по размеру и по времени создания файлов,
или постоянно следить за папкой и при появлении новых файлов сразу писать в 2 лога?

А так вот функция, которая пишет по 100 файлов в лог по времени и размеру в 2 лога:
Код:
#include <File.au3>
#include <Array.au3>

Global $sDir_Where_Search = 'D:\1' ; папка поиска

Global $aTemp = _FileListToArray($sDir_Where_Search, '*', 1)
Global $slog1 = 'C:\log1.txt', $slog2 = 'C:\log2.txt' ; логи

_File_Size_and_Time()


Func _File_Size_and_Time()

	Dim $aFile_and_Time[$aTemp[0] + 1][2] = [[$aTemp[0]]]
	For $i = 1 To $aFile_and_Time[0][0]
		$aFile_and_Time[$i][0] = $aTemp[$i]
		$aFile_and_Time[$i][1] = FileGetTime($sDir_Where_Search & '\' & $aTemp[$i], 1, 1)
	Next
	_ArraySort($aFile_and_Time, 0, 1, 0, 1)
	;_ArrayDisplay($aFile_and_Time)
	
	$To = 100
	If $aFile_and_Time[0][0] < $To Then $To = $aFile_and_Time[0][0]
	$file = FileOpen($slog1, 2)
	For $i = 1 To $To
		FileWriteLine($file, $sDir_Where_Search & '\' & $aFile_and_Time[$i][0] & ' ' & $aFile_and_Time[$i][1] & ' ' & @CRLF)
	Next
	FileClose($file)


	Dim $aFile_and_Size[$aTemp[0] + 1][2] = [[$aTemp[0]]]
	For $i = 1 To $aFile_and_Time[0][0]
		$aFile_and_Size[$i][0] = $aTemp[$i]
		$aFile_and_Size[$i][1] = FileGetSize($sDir_Where_Search & '\' & $aTemp[$i])
	Next
	_ArraySort($aFile_and_Size, 1, 1, 0, 1)
	;_ArrayDisplay($aFile_and_Size)
	
	$To = 100
	If $aFile_and_Size[0][0] < $To Then $To = $aFile_and_Size[0][0]
	$file = FileOpen($slog2, 2)
	For $i = 1 To $To
		FileWriteLine($file, $sDir_Where_Search & '\' & $aFile_and_Size[$i][0] & ' ' & $aFile_and_Size[$i][1] & ' ' & @CRLF)
	Next
	FileClose($file)
EndFunc   ;==>_File_Size_and_Time
 
Автор
K

komorov74

Новичок
Сообщения
81
Репутация
0
это все хорошо!!!!! но вот подпапки она не сканирует :(
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
О как, выясняется что подпапки должна сканировать, komorov74, пишите сразу что вам нужно, что бы потом не оказалось, что еще должна смс отправлять..
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
komorov74
Это не трудно добавить:

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

While 1
	If @HOUR = '20' And @MIN = '30' Then
		_File_Size_and_Time()
		Sleep(65000)
	EndIf
	Sleep(1000)
WEnd

Func _File_Size_and_Time()
	
	$sDir_Where_Search = 'D:\1' ; папка поиска

	$aTemp = _FileDirList($sDir_Where_Search, '*', 1, 1)

	$slog1 = 'C:\log1.txt' ; лог1
	$slog2 = 'C:\log2.txt' ; лог2

	Dim $aFile_and_Time[$aTemp[0] + 1][2] = [[$aTemp[0]]]
	For $i = 1 To $aFile_and_Time[0][0]
		$aFile_and_Time[$i][0] = $aTemp[$i]
		$aFile_and_Time[$i][1] = FileGetTime($aTemp[$i], 1, 1)
	Next
	_ArraySort($aFile_and_Time, 0, 1, 0, 1)
	
	For $i = 1 To $aFile_and_Time[0][0]
		$aTime = FileGetTime($aFile_and_Time[$i][0], 1, 0)
		$aFile_and_Time[$i][1] = $aTime[0] & '/' & $aTime[1] & '/' & $aTime[2] & ' ' & $aTime[3] & ':' & $aTime[4] & ':' & $aTime[5]
	Next
	;_ArrayDisplay($aFile_and_Time)
	
	$To = 100
	If $aFile_and_Time[0][0] < $To Then $To = $aFile_and_Time[0][0]
	$file = FileOpen($slog1, 2)
	For $i = 1 To $To
		FileWriteLine($file, $aFile_and_Time[$i][0] & ' ' & $aFile_and_Time[$i][1] & ' ' & @CRLF)
	Next
	FileClose($file)


	Dim $aFile_and_Size[$aTemp[0] + 1][2] = [[$aTemp[0]]]
	For $i = 1 To $aFile_and_Time[0][0]
		$aFile_and_Size[$i][0] = $aTemp[$i]
		$aFile_and_Size[$i][1] = FileGetSize($aTemp[$i])
	Next
	_ArraySort($aFile_and_Size, 1, 1, 0, 1)
	;_ArrayDisplay($aFile_and_Size)

	$To = 100
	If $aFile_and_Size[0][0] < $To Then $To = $aFile_and_Size[0][0]
	$file = FileOpen($slog2, 2)
	For $i = 1 To $To
		FileWriteLine($file, $aFile_and_Size[$i][0] & ' ' & $aFile_and_Size[$i][1] & ' ' & @CRLF)
	Next
	FileClose($file)
EndFunc   ;==>_File_Size_and_Time

Func _FileDirList($sPath, $sFileMask = "*", $iFlag = 0, $iSubDir = 1, $iSort = 0)
	Local $sOutBin, $sOut, $aOut, $aMasks, $sRead, $hDir, $sAttrib, $sFiles

	If Not StringInStr(FileGetAttrib($sPath), "D") Then
		Return SetError(1, 0, 0)
	EndIf

	If $iSubDir = 1 Then
		$sAttrib &= ' /S'
	EndIf

	If $iSort = 1 Then
		$sAttrib &= ' /O:N'
	EndIf

	Switch $iFlag
		Case 1
			$sAttrib &= ' /A-D'
		Case 2
			$sAttrib &= ' /AD'
		Case Else
			$sAttrib &= ' /A'
	EndSwitch

	$sOut = StringToBinary('0' & @CRLF, 2)
	$sPath = StringRegExpReplace($sPath, '\\+$', '')
	$sFileMask = StringRegExpReplace($sFileMask, '^;+|;+$', '')
	$sFileMask = StringRegExpReplace($sFileMask, ';{2,}', ';')
	$aMasks = StringSplit($sFileMask, ';')

	For $i = 1 To $aMasks[0]
		If StringStripWS($aMasks[$i], 8) = "" Then
			ContinueLoop
		EndIf

		$sFiles &= '"' & $sPath & '\' & $aMasks[$i] & '"'

		If $i < $aMasks[0] Then
			$sFiles &= ';'
		EndIf
	Next

	$hDir = Run(@ComSpec & ' /U /C DIR ' & $sFiles & ' /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)

	While ProcessExists($hDir)
		$sRead = StdoutRead($hDir, False, True)

		If @error Then
			ExitLoop
		EndIf

		If $sRead <> "" Then
			$sOut &= $sRead
		EndIf
	Wend

	$aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)

	If @error Or UBound($aOut) < 2 Then
		Return SetError(2, 0, 0)
	EndIf

	$aOut[0] = UBound($aOut) - 1
	Return $aOut
EndFunc   ;==>_FileDirList

Исправил пару ошибок + добавил возможный вариант включения раз в сутки
 
Автор
K

komorov74

Новичок
Сообщения
81
Репутация
0
РЕБЯТ!!!! БОЛЬШОЕЕЕЕЕЕЕЕЕЕЕЕЕЕ СПАСИБО!!!!!
Только второй вариант -не работает :(
директория -с 14 файлами и двумя подпапками -сканирует -7 минут
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
komorov74
Должно работать
Для проверки нужно в цикле выставить ближайшее время
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
http://autoit-script.ru/index.php/topic,4883.msg35734.html#msg35734
http://autoit-script.ru/index.php/topic,6426.msg44861.html#msg44861
 
Автор
K

komorov74

Новичок
Сообщения
81
Репутация
0
ВСЁ САМ СТОРМАЗНУЛ!!!!!!!!!!!!!

ВСЁ РАБОТАЕТ!!!!!!!!!!!!!

а время можно в человеческом формате ?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
komorov74

Можно

Обновил предыдущий код - формат YYYY/MM/DD HH:MM:SS
 
Автор
K

komorov74

Новичок
Сообщения
81
Репутация
0
СПАСИБО!!!!!!!!!!!
Теперь я хоть буду в курсе что накачали домашнии на NAS
 
Верх