Что нового

Как быстро найти файлы, которые изменились за последние 30 секунд?

Suppir

Продвинутый
Сообщения
967
Репутация
62
Есть некая директория со вложенными другими директориями и файлами. Как искать файлы внутри директорий я знаю. Но нужно сделать следующее:

чтобы программа висела в трее и периодически (раз в 30 секунд) проверяла директорию. После чего выдавала в лог имена (полные пути) новых файлов или изменившихся с момента прошлой проверки. Т.е. скрипт должен в фоновом режиме проверять, какие файлы меняются или добавляются.


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

В директории несколько сотен поддиректорий и, примерно, 10 тыс. файлов.
 

Renz

Осваивающий
Сообщения
63
Репутация
37
Быстро понятие растяжимое. Зависит от количества файлов. Можно смотреть по дате изменения используя FileGetTime(). Можно вычислением хеша файла тут надежней, но дольше. В зависимости для каких целей все это мутить. Если надо через сеть - DropBox.


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

Хм. 10тыс. за 30 сек. :whistle: Маловато времени.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Renz
Смотрите, в total commander это получается за 2 - 3 секунды:
зажимаем CTRL+b - отображаются все файлы во вложенных директориях
сортируем по дате - вот вам и новые файлы.

Если total commander это делает за 2 - 3 секунды, то, теоретически, можно и с помощью AutoIt сделать.

Dropbox не пойдет, все файлы на винчестере.
 

Renz

Осваивающий
Сообщения
63
Репутация
37
Если новые то возможно, а если проверять еще и на изменение...
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Total Commander явно использует какую-то API-шную функцию для получения информации о файлах.
 

agikon

Знающий
Сообщения
789
Репутация
17
madmasles
у меня не открывается ссылка.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
madmasles
похоже на то, спасибо!

буду разбираться. Тему пока не закрываю.
 

Renz

Осваивающий
Сообщения
63
Репутация
37
Тест: Поиск файлов в папке (вкл. влож.) по определенным условиям.

Код:
$sDateLastModified = "20050504144528.000000+240"
$Computer = "."
$sDriver = "Z:"
;$sFolderPath = "C:\temp"
$sFolderPath = "C:\windows"
RunWait(@ComSpec & " /c " & 'subst ' &$sDriver &' ' &$sFolderPath , "", @SW_HIDE)
Local $objWMI = ObjGet("winmgmts:\\" & $Computer & "\root\cimv2")

$strQueryFile = "SELECT * FROM CIM_DataFile WHERE Drive='" & $sDriver & "' AND Extension = 'exe'"
;$strQueryFile = "SELECT * FROM CIM_DataFile WHERE Drive='" & $sDriver & "' AND Extension = 'exe' AND LastModified = '"& $sDateLastModified &"'"
;MsgBox (0,"", $strQueryFile)
$FileList = $objWMI.ExecQuery($strQueryFile)

For $objItem in $FileList
	ConsoleWrite($objItem.Name & @CRLF)
Next
RunWait(@ComSpec & " /c " & 'subst ' &$sDriver &' ' &'/d' , "", @SW_HIDE)


Подопытный: C:\windows
Содержит: Файлов: 53 103; папок: 11 243
Результат теста: >Exit code: 0 Time: 19.191
 

Renz

Осваивающий
Сообщения
63
Репутация
37
А вот с датой подольше раз в 10 :(
 

Renz

Осваивающий
Сообщения
63
Репутация
37
Вот подредактировал сам запрос. Находит за 1-3 сек. в "C:\windows" :laugh:

Код:
$strQueryFile = "SELECT Name FROM CIM_DataFile WHERE Drive='" & $sDriver & "' AND LastModified > '"& $sDateLastModified &"'"
 
Верх