Вопрос по коду

Kriogen

Новичок
Вопрос по коду

Ниже код с php.net выводит список файлов в директории, но у него один минус-то, что в
адресной строке отображается абсолютный путь! соответственно любой может исправить
его и просмотреть структуру сайта. как это исправить? Лучше, конечно чтобы путь в
адресной строке вообще не появлялся... как сделать?

Может кто не поленится написать принцип работы скрипта по обходу директорий на примере самого простого кода, буду благодарен( А именно поподробнее расскажет про рекурсивный вызов функции, т.е. пример должен содержать реализацию сёрфинга по папкам).


P.S. Этот код мне нужен для написания электронной библиотеки, содержащей рар и зип архивы.

PHP:
<?
function showDir($dir, $i, $maxDepth){
   $i++;
   if($checkDir = opendir($dir)){
       $cDir = 0;
       $cFile = 0;
       // check all files in $dir, add to array listDir or listFile
       while($file = readdir($checkDir)){
           if($file != "." && $file != ".."){
               if(is_dir($dir . "/" . $file)){
                   $listDir[$cDir] = $file;
                   $cDir++;
               }
               else{
                   $listFile[$cFile] = $file;
                   $cFile++;
               }
           }
       }
      
       // show directories
       if(count($listDir) > 0){
           sort($listDir);
           for($j = 0; $j < count($listDir); $j++){
               echo "
               <tr>";
                   $spacer = "";
                   for($l = 0; $l < $i; $l++) $spacer .= "&emsp;";
                   // create link
                   $link = "<a href=\"" . $_SERVER["PHP_SELF"] . "?dir=" . $dir . "/" . $listDir[$j] . "\">$listDir[$j]</a>";
                   echo "<td>" . $spacer . $link . "</td>
               </tr>";
               // list all subdirectories up to maxDepth
               if($i < $maxDepth) showDir($dir . "/" . $listDir[$j], $i, $maxDepth);
           }
       }
      
       // show files
       if(count($listFile) > 0){
           sort($listFile);
           for($k = 0; $k < count($listFile); $k++){
               $spacer = "";
               for($l = 0; $l < $i; $l++) $spacer .= "&emsp;";
               echo "
               <tr>
                   <td>" . $spacer . $listFile[$k] . "</td>
               </tr>";   
           }
       }       
       closedir($checkDir);
   }
}

if($_GET["dir"] == "" || !is_dir($_GET["dir"])) $dir = getcwd();
else $dir = $_GET["dir"];
// replace backslashes, not necessary, but better to look at
$dir = str_replace("\\", "/", $dir);

// show parent path
$pDir = pathinfo($dir);
$parentDir = $pDir["dirname"];

echo "<a href=\"" . $_SERVER["PHP_SELF"] . "\"><h3>Home</h3></a>";
echo "Current directory: " . $dir;
echo "<a href=\"" . $_SERVER["PHP_SELF"] . "?dir=$parentDir\"><h4>Parent directory: $parentDir</h4></a>";

// Display directory content
echo"<table border=1 cellspacing=0 cellpadding=2>
<tr><th align=left>File / Dir</th>";

// specifies the maxDepth of included subdirectories
// set maxDepth to 0 if u want to display the current directory
$maxDepth = 0;
showDir($dir, -1, $maxDepth);  
?>
 

White Rabbit

белый кролик
Принцип работы скрипта по обходу директории следующий:
1. Открываем директорию.
2. Запускаем цикл
Читаем элемент директории
Если он указывает на текущую директорию, или на родительскую,
- пропускаем
Если это файл - что-то делаем
Если это директория - запускаем для нее этот же алгоритм.
3.Конец цикла
4.Закрываем директорию.
 

Kriogen

Новичок
Если он указывает на текущую директорию, или на родительскую,
- пропускаем
как это условие написать на php?

-~{}~ 01.04.06 18:05:

Если это директория - запускаем для нее этот же алгоритм.
как правильно вызвать эту же функцию и сформировать ссылку?
 

ns

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

Kriogen

Новичок
ns,
а можешь на примере показать?
а то я только начинаю изучать php и мне еще сложно понять про дескрипторы и точки входа и т.д.
 

Фанат

oncle terrible
Команда форума
как это условие написать на php?
текущая - .
вышестоящая - ..
как правильно вызвать эту же функцию и сформировать ссылку?
вызвать точно так же, как и любую другую.
ссылку никакую формировать на надо.
надо указать директорию.
просто добавив к текущему пути имя каталога

-~{}~ 02.04.06 12:53:

мне еще сложно понять про дескрипторы и точки входа и т.д.
вот и не парься пока.
 

Kriogen

Новичок
ниже код.... как вызвать функцию, чтобы она мне вывела список файлов в каталоге по которому я щелкну?
ссылка на скрипт http://library.iskra-net.ru/new1.php

PHP:
<?php
function listing()
{
if ($handle = opendir('./lib/')) {
$dir =getcwd();
echo $dir; 
    while (false !== ($file = readdir($handle))) {  
 if ($file != "." && $file != "..") {    
       echo "<br><a href=$file>$file</a>";
			}
	   	}   
	}
}
listing();
?>
 

Фанат

oncle terrible
Команда форума
слушай, а чем тебя не устраивает листинг директории апача?
 

Kriogen

Новичок
Фанат, :) я хочу под свой дизайн листинг сделать и к томуже, я не знаю как этот стандартный листинг видоизменить! например раздвинуть колонки, т.е. увеличить их ширину, ну и т.д. ..... кароче красивее будет, если сделать свой скрипт, к которому можно применить стили оформления!
 

Фанат

oncle terrible
Команда форума
помести в каталог, который надо просматривать, файл .htaccess с текстом
DirectoryIndex /listing.php
а в корень сайта- listing.php
в котором и помести свой скрипт, безо всяких функций.
и всё
 

Kriogen

Новичок
а чтобы не в каждую папку кидать, а для всех сразу можно сделать или нет?
 

Kriogen

Новичок
Фанат, не нравится! ты прав... но на серваке столько папок что замучаешься в каждую кидать!
 

Фанат

oncle terrible
Команда форума
зачем что-то кидать в каждую?
кинуть надо в один, в тот, с которого надо начинать просмотр.
 

Фанат

oncle terrible
Команда форума
в opendir подставляй переменную $dir, которая получается вот так
$dir=$_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'];

и обращаться надо не к library.iskra-net.ru/listing.php, а к library.iskra-net.ru
и $file в ссылке кодировать с помощью rawurlencode()
 

Kriogen

Новичок
у меня вся библиотека лежит в http://library.iskra-net.ru/lib/ соответственно обращаться нужно к этой папке!?
т.е. она получается корень от которого надо плясать... туда я кинул .htaccess и сам код вот он ....

PHP:
<?php
$dir=$_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'];
if ($handle = opendir('./lib/')) {

    while (false !== ($file = readdir($handle))) {  
 if ($file != "." && $file != "..") { 
  $fcod= rawurlencode($file) ;
       echo "<br><a href=$fcod>$file</a>";
			}
	   	}   
	}
?>
 

Kriogen

Новичок
Фанат
в аксессе
DirectoryIndex /listing.php

подставил $dir , не работает
 
Сверху