Что нового

Поиск папки с наибольшим именем и ее открытие

alexnasa

Новичок
Сообщения
50
Репутация
0
Пояснить хочу -что за дебри такие и что за разрастающиеся древа у меня. Программа видеозаписи пишет в папки и именует их по такому алгоритму: 2010/01-*-12/1-2-3***30-31/1-2-*-*-24 Задача- заглянуть в самую старшую (и в смысле числа и в смысле свежести даты создания) и посмотреть на дату самого юного файла видеоролика - не слишком ли он стар (оно может и не пишет давным-давно)


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

так, а если есть папки 1 и 2(на одном уровне), в первой есть папка 5, а во второй 3, то нужна результатирующая - 5 или 3?
третья нужна
 

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Может в определенном каталоге и всех его подкаталогах просто найти самый свежий файл по аттрибуту время модификации?

Код:
$sFolder = 'd:\targetfolder'
$sCopyPath = 'd:\destfolder'

$LastModifiedFile = Search($sFolder & "\")
FileCopy($LastModifiedFile, $sCopyPath, 1)
$TargetFolder = StringLeft($LastModifiedFile, StringInStr($LastModifiedFile, "\", 0, -1))
ShellExecute($TargetFolder)
Exit


Func search($source_folder)
    Static $max = "0"
    Static $file = ""

    $search = FileFindFirstFile($source_folder & "*.*")

    While 1
        $source_file = FileFindNextFile($search)
        if @error then ExitLoop
        if @extended Then ;- каталог. Просматриваем содержимое...
            search($source_folder & $source_file & "\")
            ContinueLoop
        EndIf

        $FileModifiedTime = FileGetTime($source_folder & $source_file, 0, 1)
        if  StringCompare($FileModifiedTime, $max,2) > 0 Then
            $max = $FileModifiedTime
            $file = $source_folder & $source_file
        EndIf
    WEnd
    Return $file
EndFunc


Во, так точно должно работать....
 

alexnasa

Новичок
Сообщения
50
Репутация
0
Тотал розыск самого юного файла уже готов и работает!(код не мой- сложен из двух) И получаю список самых юных 28 дат для скриншота. Но этот вариант долог по сравнению с "интеллектуальным по древу" (по алгоритму наибольшего). Его буду пользовать только если не удастся объяснить коду АЛГОРИТМ поиска. Т.е. не вслепую а ИДИ ПО ДРЕВУ до конца. Файлов сегодня на диске может быть многовато. Нынче дватерабайтники пошли, а завтра могут пойти 222 терабайтники..
Код:
#Include <File.au3>
#Include <Array.au3>

$aReturn = _FileSearch(@WindowsDir, "*.txt")
;_ArrayDisplay($aReturn)

;$iFlag = 0 - Файлы и папки (по умолчанию)
;$iFlag = 1 - Только файлы
;$iFlag = 2 - Только папки
Func _FileSearch($sPath, $sFileMask, $iFlag = 1)
    Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib
    
    Switch $iFlag
        Case 1
            $sAttrib = ' /A-D'
        Case 2 
            $sAttrib = ' /AD'
        Case Else 
            $sAttrib = ' /A'
    EndSwitch
    
    $sOut = StringToBinary('0' & @CRLF, 2)
    $aMasks = StringSplit($sFileMask, ';')
    
    For $i = 1 To $aMasks[0]
        $hDir = Run(@ComSpec & ' /U /C DIR "' & $sPath & '\' & $aMasks[$i] & '" /S /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)
        
        While 1
            $sRead = StdoutRead($hDir, False, True)
            
            If @error Then
                ExitLoop
            EndIf
            
            If $sRead <> "" Then
                $sOut &= $sRead
            EndIf
        Wend
    Next
    
    $aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)
    
    If @error Then
        Return SetError(1)
    EndIf
    
    $aOut[0] = UBound($aOut)-1
    Return $aOut
EndFunc


Dim $aReturnB[$aReturn[0]+1][2]
$aReturnB[0][0] = $aReturn[0]

For $i = 1 To $aReturn[0] Step +1
    $aReturnB[$i][1] = FileGetTime($aReturn[$i], 0, 1)
Next

_ArraySort($aReturnB, 1, 1, $aReturnB[0][0], 1)
_ArrayDisplay($aReturnB,"Свежие даты")
 

aleratorio

Осваивающий
Сообщения
85
Репутация
43
ну тут скорее от количества файлов зависит, а не от их размера. на 222х терабайтниках и файлы будут поболе и компы с винтами пошустрее...
 

alexnasa

Новичок
Сообщения
50
Репутация
0
Да-да колич файлов может вырасти до неприемлемо долгого поиска.
 

aleratorio

Осваивающий
Сообщения
85
Репутация
43
только что проверил немного измененным скриптом свой диск D (890 гб из 920 занято) на самый последний измененный файл
результат: файлов просмотрено : 435827, время 2 минуты 59 секунд



Код:
#Include <Date.au3>

$sFolder = "D:"
;$sCopyPath = @ScriptDir & '\destfolder'

$timer = TimerInit()
$num = 0
$LastModifiedFile = Search($sFolder & "\")
Global $Hour, $Mins, $Secs
;FileCopy($LastModifiedFile, $sCopyPath, 1)
;$TargetFolder = StringLeft($LastModifiedFile, StringInStr($LastModifiedFile, "\", 0, -1))
;ShellExecute($TargetFolder)
_TicksToTime(Int(TimerDiff($timer)), $Hour, $Mins, $Secs)
$searchtime = StringFormat("%02i:%02i:%02i", $Hour, $Mins, $Secs)
MsgBox(0, "", "Файл =" & $LastModifiedFile & "  Время =" & $searchtime & "  Количество просмотренных файлов =" & $num)
Exit


Func search($source_folder)
    Static $max = "0"
    Static $file = ""

    $search = FileFindFirstFile($source_folder & "*.*")

    While 1
        $source_file = FileFindNextFile($search)
        if @error then ExitLoop
        if @extended Then ;- каталог. Просматриваем содержимое...
            search($source_folder & $source_file & "\")
            ContinueLoop
        EndIf

        $FileModifiedTime = FileGetTime($source_folder & $source_file, 0, 1)
        if  StringCompare($FileModifiedTime, $max,2) > 0 Then
            $max = $FileModifiedTime
            $file = $source_folder & $source_file
        EndIf
		$num += 1
    WEnd
    Return $file
EndFunc


Хотя конечно, ради интереса, можно попробовать решить задачку и интеллектуальным способом)))
 

alexnasa

Новичок
Сообщения
50
Репутация
0
Так это может быть не сервер был? У котрого "своих дел" процентов на 110.. Да тут еще обыск.. А диск и так занят кошмаром записи-чтения (сервер его пишет-читает)
 

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Загрузка диска именно этим скриптом показывала - 8% , и мне кажется мой пример поиска файла покороче и побыстее будет. Одни только StringRegExp в твоем примере наверно времени сколько отнимают.

Тестировал на Core 2 Duo 2,2 Ггц, 2,5 гига оперативы, винт правда Raid 0( 2x500гб WD Caviar Blue )
 

alexnasa

Новичок
Сообщения
50
Репутация
0
Тотал обыск ТОЖЕ ооч нужен! Но не каждые 20 мин. А вообще. Т.к. иногда алгоритм записи прогаммой её файлов не ясен до конца или не стандартен в разное время суток (есть одна прога, которую от полуночи до пяти утра пишет не в старшую папку а в темп)


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

отлучаюсь до вечера! Спасибоо!
 

aleratorio

Осваивающий
Сообщения
85
Репутация
43
А при чем тут тотал обыск? Указываешь в какой конкретно папке искать:
$sFolder = 'd:\targetfolder'
, я просто целиком диск проверял для того что бы узнать как по времени будет идти поиск большого количества файлов. И не уж то в папке, в которую пишет -
Программа видеозаписи
более 500000 файлов, да еще и находящихся на сервере, у которого:
"своих дел" процентов на 110
:shok:

Я тут подумал, что если известно что файлы находятся именно в папках relise, то можно просто искать файлы только в каталогах с таким именем, не просматривая файлы в других каталогах . Еще побыстрее будет.

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

Ближе к ночи попробую что нибудь наваять...
 

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Вот попробуй:

Код:
#include <File.au3>

$sFolder = 'd:\targetfolder'
$sCopyPath = 'd:\destfolder'

While 1
	$aFolderlist = _FileListToArray($sFolder, '*', 2)
	If Not IsArray($aFolderlist) Then ExitLoop ;если в каталоге нет ни одного подкаталога - поиск закончен
	$nMax = 0
	$sMax = ''
	For $i = 1 to $aFolderlist[0]; Поиск максимума
		If StringRegExp($aFolderlist[$i], '^[0-9]+$') Then ;проверка того что имя каталога - числовое значение
			If Number($aFolderlist[$i]) >= $nMax Then
				$nMax = Number($aFolderlist[$i])
				$sMax = $aFolderlist[$i]
			EndIf
		EndIf
	Next
	If $sMax <> '' Then ; если найдены подкаталоги с числовым значением
		$sFolder &= '\' & $sMax ;добавляем подкаталог с наибольшим значением к нашему пути и на следующем круге цикла поиск будет происходить уже в нем
	Else
		ExitLoop ;иначе поиск закончен
	EndIf
WEnd

FileCopy($sFolder & '\release\somefiletocopy.ext', $sCopyPath, 1)
ShellExecute($sFolder)


Вроде так как ты хотел...
 

alexnasa

Новичок
Сообщения
50
Репутация
0
Работает! Роет до самого дна древа! Идет только по самым старшим именам!Спасибо, огромное за помощь! Сейчас буду изучать код. Кстати в моём частном случае мне достаточно просто окрыть последнюю в древе "старшую" папку и сделать скриншот в отчеты (дежурный посмотрит-проверит как там дела) Хотя в идеале надо будет докручивать вместо картинки что-то типа логов на смс. Но это легко варианты менять от нужд. Другими словами:
1- работет код по каждому архиву доли секунды при любой глубине древа.....
2- код готов подтверждать архив от ЛЮБОЙ программы. Даёшь только направление (\\videoserver**\arch\camera22\), он сам разберётся в иерархии, пусть она и громоздкая, ему все равно т.к.- алгоритм ему ясен как день.
А можно изменить жестко прописанный адрес на "начиная прямо из текущего директория"? Тогда екзешник положенный заранее "там где надо" станет универсальной программой. У меня не получилось по маске '*'
 

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Пожалуйста :smile:

alexnasa сказал(а):
А можно изменить жестко прописанный адрес на "начиная прямо из текущего директория"? Тогда екзешник положенный заранее "там где надо" станет универсальной программой. У меня не получилось по маске '*'

Код:
$sFolder = @ScriptDir
, если я правильно понял...
 

alexnasa

Новичок
Сообщения
50
Репутация
0
Великое спасибо! Работает всё! Теперь адрес не нужен - просто положи один и тот же arch-ok.exe и забирай в каждой шаре текущий фотоотчет.
 

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Можно еще выбрать начальный каталог, как вариант
Код:
$sFolder = FileSelectFolder('Select Folder', '')
 

alexnasa

Новичок
Сообщения
50
Репутация
0
Работает, готово, благодарен искренне за драгоценное внимание! Уже разложил екзешники в исходные директории и заработал отчет-контроль архивов в vрелизе "visual mode".
Далее я сам допишу преключение представления в режим таблицы и делание скриншота, после того аутоит отправит *.jpg по почте. А еще, оказывается у мобил федерал номера есть синтаксис с собакой, употребляя который почт-адресом мобтел получает смс. Еще было бы вариантом получить не картинку в итоге (что УЖЕ супер и документом-отчетом вполне служит), а листинг-текст этого последнего директория
(в варианте командной строки майкрософт dir >listing.txt) и отправлять отчет уже вроде лога а не фото.
 

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Код:
ShellExecute(@ComSpec, '/c dir>listing.txt', $sFolder, '', @SW_HIDE)
 

alexnasa

Новичок
Сообщения
50
Репутация
0
т.е. вообще реально папка с текст- отчетами получится (физически в GUI сами папки открывать и не надо )
Код:
ShellExecute(@ComSpec, '/c dir>с:\logs\listing.txt', $sFolder, '', @SW_HIDE)


Воистину, помощь других иногда имеет решающее значение в собственном развитии.. Теперь я понимаю, что ничего б у меня самого не получилось бы. Начну собирать первую бетаверсию сборщика налогов отчетов по факту работы разношерстных систем регистрации-записи.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
irshat,
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Модератор.
 
Верх