Сейчас на форуме: asfa, bartolomeo, hgdagon (+6 невидимых)

 eXeL@B —› Программирование —› Кто-нить кодил на PHP?
Посл.ответ Сообщение

Ранг: 53.0 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 07 июня 2006 07:59 · Поправил: alex111
· Личное сообщение · #1

Привет надо сделать что-то типа карты сайта.
function myreaddir($dir)//считывает все файлы в папке в массив $files
////////////////////////////////////////////////////////////////////// /////////////////////////
function isdir($files)
foreach ($files as $value) //$files массив возвращенный функ. readdir
{if(is_dir($value)) //если папка
{myreaddir($value); //считаем файлы в ней
isdir($value);} //
}

в таком случае дерево папок получается не правильное.
если в директории не одна папка.
находит первую папку, в ней то-же первую, в ней ...и т.д.
второй, третьеи и др. папок нет.

Не хватает фантазии, как сделать правильно?,Есть какие нибудь мысли?




Ранг: 104.1 (ветеран)
Активность: 0.070
Статус: Участник
искатель истЕны

Создано: 07 июня 2006 08:09
· Личное сообщение · #2

ужас

www.php.net/manual/ru/function.readdir.php
php.net/dir

в комментах примеров на все случаи жизни



Ранг: 5.0 (гость)
Активность: 0.010
Статус: Участник

Создано: 07 июня 2006 08:23
· Личное сообщение · #3

$dir = ""; абсолютный путь к папке на сервере
$d = dir("$dir");
if(isdir($d)){
while($entry=$d->read()) {
echo $entry."<br>\n";
}
}
$d->close();


Пробуй



Ранг: 53.0 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 07 июня 2006 09:09 · Поправил: alex111
· Личное сообщение · #4

realcoding пишет:
Пробуй

Попробовать смогу только вечером.
Но бегло глянув на код, кажется это не то.

$dir = ""; абсолютный путь к папке на сервере
$d = dir("$dir"); //
if(is_dir($d)){ //если папка
while($entry=$d->read()) { //считаем все файлы в $entry
echo $entry."<br>\n"; //вывод в браузер
}
}
$d->close();


А вложеные папки? Я хочу автоматизировать процесс. Типа залил файлы на сервак а в карте они сами добавятся.




Ранг: 467.7 (мудрец), 5thx
Активность: 0.270
Статус: Участник
Иной :)

Создано: 07 июня 2006 17:05 · Поправил: [HEX]
· Личное сообщение · #5

alex111
Тебе же Пахан дал ссылки?! Разве так сложно зайти и посмотреть? Или все за тебя должны написать?

Here is my recursive read dir function, what read dir by mask.
[php]
function ls($dir, $mask /*.php$|.txt$*/)
{
static $i = 0;
$files = Array();
$d = opendir($dir);
while ($file = readdir($d))
{
if ($file == '.' || $file == '..' || eregi($mask, $file) ) continue;
if (is_dir($dir.'/'.$file))
{
$files += ls($dir.'/'.$file, $mask);
continue;
}
$files[$i++] = $dir.'/'.$file;
}
return $files;
}
$f = ls('E:/www/mymoney/lsdu', ".php$" /*no spaces*/);
[/php]

примеров там уйма
<?
$the_array = Array();
$handle = opendir('prace/.');
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$the_array[] = $file;
}
}
closedir($handle);
sort ($the_array);
reset ($the_array);
while (list ($key, $val) = each ($the_array)) {
echo "<a href=prace.php?id=$val>$val</a><br>";
}
?>

-----
Computer Security Laboratory




Ранг: 5.0 (гость)
Активность: 0.010
Статус: Участник

Создано: 07 июня 2006 17:52
· Личное сообщение · #6

Вот все, что тебе необходимо:

function listing($dir) {
if($dir[strlen($dir)-1]!='/') $dir.='/';
$phandle = opendir($dir);
$count=0;
readdir($phandle); readdir($phandle);
while($pfile = readdir($phandle)) {
if(is_dir($dir.$pfile)) echo($dir.$pfile);
else if(ereg(".rar$",$dir.$pfile)) echo($dir.$pfile);
}
closedir($phandle);
return ($count);
}


Если надо доработай ссылки



Ранг: 53.0 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 07 июня 2006 18:35
· Личное сообщение · #7

[HEX] пишет:
Разве так сложно зайти и посмотреть?

Посмотрел... справочник у меня и в локалке есть.
а мне нужен алгоритм.

[HEX]
realcoding

Спасибо за исходники, буду пробовать.



Ранг: 53.0 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 07 июня 2006 19:46
· Личное сообщение · #8

[HEX]
realcoding

не работает ни один пример.
Я может не так описал задачу.
Например в корневой директории такая структура файлов:
dir1
subdir1
subdir2
subsub1
sssub1
dir2
subdir1

...и т.д.
все примеры выводят либо
dir1
dir2

либо
dir1/subdir1
dir1/subdir2

Мне надо полную структуру файлов одним! запросом.




Ранг: 467.7 (мудрец), 5thx
Активность: 0.270
Статус: Участник
Иной :)

Создано: 07 июня 2006 22:47
· Личное сообщение · #9

alex111
Так перепиши под свои нужды, как тебе удобнее! Работу с директориями и рекурсией тебе уже и так показали.

-----
Computer Security Laboratory




Ранг: 53.0 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 15 июня 2006 07:37
· Личное сообщение · #10

Блин хоть убейте, но is_dir() почемуто не считает поддиректории папками.
if ((is_dir($var))&&($var!=".")$$($var!=".."))//в этой строке если убрать is_dir() поддиректории выводятся пока не нарвется на файл.



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 15 июня 2006 12:24
· Личное сообщение · #11

www.php.net/manual/ru/function.opendir.php
Чуть-чуть подредактировал вариант из 2-й заметки mstabile75.
Правда он все равно глючит на 21-й строке, но выдает много поддиректорий.
=======================
<?php
/* The below function will list all folders and files within a directory
It is a recursive function that uses a global array. The global array was the easiest
way for me to work with an array in a recursive function
*This function has no limit on the number of levels down you can search.
*The array structure was one that worked for me.
ARGUMENTS:
$startdir => specify the directory to start from; format: must end in a "/"
$searchSubdirs => True/false; True if you want to search subdirectories
$directoriesonly => True/false; True if you want to only return directories
$maxlevel => "all" or a number; specifes the number of directories down that you want to search
$level => integer; directory level that the function is currently searching
*/
function filelist ($startdir="./", $searchSubdirs=1, $directoriesonly=0, $maxlevel="all", $level=1) {
//list the directory/file names that you want to ignore
$ignoredDirectory[] = ".";
$ignoredDirectory[] = "..";
$ignoredDirectory[] = "_vti_cnf";
global $directorylist; //initialize global array
if (is_dir($startdir)) {
if ($dh = opendir($startdir)) {
while (($file = readdir($dh)) !== false) {
if (!(array_search($file,$ignoredDirectory) > -1)) {
if (filetype($startdir . $file) == "dir") {
//build your directory array however you choose;
//add other file details that you want.
$directorylist[$startdir . $file]['level'] = $level;
$directorylist[$startdir . $file]['dir'] = 1;
$directorylist[$startdir . $file]['name'] = $file;
$directorylist[$startdir . $file]['path'] = $startdir;
if ($searchSubdirs) {
if ((($maxlevel) == "all") or ($maxlevel > $level)) {
filelist($startdir . $file . "/", $searchSubdirs, $directoriesonly, $maxlevel, $level + 1);
}
}
} else {
if (!$directoriesonly) {
//if you want to include files; build your file array
//however you choose; add other file details that you want.
$directorylist[$startdir . $file]['level'] = $level;
$directorylist[$startdir . $file]['dir'] = 0;
$directorylist[$startdir . $file]['name'] = $file;
$directorylist[$startdir . $file]['path'] = $startdir;
}}}}
closedir($dh);
}}
return($directorylist);
}
$files = filelist("f:/",1,1); // call the function
foreach ($files as $list) {//print array
// echo "Directory: " . $list['dir'] . " => Level: " . $list['level'] . " => Name: " . $list['name'] . " => Path: " . $list['path'] ."<br>";
echo $list['path'] ."<br>";

}?>



Ранг: 25.9 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 15 июня 2006 16:22 · Поправил: stalker
· Личное сообщение · #12

ну вы, блин, маньяки ... без опыта программирования
вот кусок одного из моих классов для создания полного snapshoot'а сайта для обновления:

/*
** [update_site_snapshot] : функция создания архивированного (gz) файла с деревом сайта.
**
** [in] : $excludes - массив исключений (игнорируемые файлы и папки).
** [out] : $array - массив с данными о сайте.
*/

function update_site_snapshot($excludes = NULL)
{
$this->oSnapshot = array();

// -- получаем "снимок" сайта --

$this->recursive_bypass("callback_snapshot", $excludes ? $excludes : array());

return $this->oSnapshot;
}

////////////////////////////////////////////////////////////////////// ///////
// private functions

/*
** [recursive_bypass] : функция "обхода" дерева сайта.
**
** [in] : $callback - функция, вызываемая при обнаружении файла или папки.
** : $excludes - исключение "элементов сайта" из рекурсии.
** : $fname - "элемент сайта" при рекурсивном вызове функции.
*/

function recursive_bypass($callback, $excludes, $fname = "")
{
if (in_array($fname, $excludes))
return;

// обработка "элемента сайта"
if (!empty($fname))
$this->$callback($fname);

// это директория?
if (is_dir(gdRoot. $fname))
{
// рекурсивный спуск по директориям
$dname = dir(gdRoot. $fname);
while (($entry = $dname->read()) !== false)
{
if (($entry != ".") && ($entry != ".."))
$this->recursive_bypass($callback, $excludes, empty($fname) ? $entry : $fname ."/". $entry);
}
$dname->close();
}
}

/*
** [callback_snapshot] : функция "обратного вызова" для построения "снимка сайта".
**
** [in] : $fname - "элемент сайта" который нужно обработать.
*/

function callback_snapshot($fname)
{
// это файл?
if (is_file(gdRoot. $fname))
{
$crc32 = 0;

if (($data = file_get_contents(gdRoot. $fname)) !== false)
$crc32 = dechex(crc32($data));

array_push($this->oSnapshot, array(
"name" => "/". $fname,
"crc32" => $crc32,
"mtime" => filemtime(gdRoot. $fname) ));
}

// это директория?
else if (is_dir(gdRoot. $fname))
{
array_push($this->oSnapshot, array(
"name" => "/". $fname ."/",
"crc32" => 0,
"mtime" => 0 ));
}
}

будет непонятно -- задавайте вопросы


 eXeL@B —› Программирование —› Кто-нить кодил на PHP?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати