parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Дата обновления последнего обновленного файла в глубине директории

Никита Козин 29.12.2005 09:32 / 29.12.2005 09:40

Есть папка, внутри которой могут быть файлы и вложенные папки с файлами. Нужно получить дату обновления последнего обновленного файла внутри указанной папки, учитывая вложенные папки, т.е. рекурсивно. Файлы могут обновляться по FTP, таким образом сделать тригер, срабатывающий при загрузке файла и попровляющий где-то (допустим в файле /mdate.log) дату последнего обновления невозможно.

Идея такая: делать ^file:list[] в указанной директории, разделять файлы и папки, а потом менюшить файлы и смотреть их дату, менюшить папки и вызывать себя рекурсивно...

Вот что получилось:
@get_dir_stat[path][_list;_files;_dirs;_stat]
^if(def $path){
	$path[^path.trim[end;/]]
}
$_list[^file:list[$path]]
$_files[^table::create[$_list][$.limit(0)]]
$_dirs[^table::create[$_list][$.limit(0)]]
^_list.menu{
	^if(-d "$path/$_list.name"){
		^_dirs.append{$path/$_list.name}
	}{
		^_files.append{$path/$_list.name}
	}
}

$result[^hash::create[]]
^if($_files){
	^_files.menu{
		$_stat[^file::stat[$_files.name]]
		$result.[$_files.name][$_stat.mdate]
	}
}
^if($_dirs){
	^_dirs.menu{
		^result.add[^get_dir_stat[$_dirs.name]]
	}
}
# end @get_dir_stat[]
И собственно метод, который вычисляет максимальную дату:
@get_max_date[hash][_dt;path;dt]
^hash.foreach[path;dt]{
	^if(def $_dt){
		^if($dt > $_dt){
			$_dt[$dt]
		}
	}{
		$_dt[$dt]
	}
}
$result[$_dt]
# end @get_max_date[]
Вызов этого добра:
$dt[^get_max_date[^get_dir_stat[]]]