Directory Lister
列出目錄裡的檔案和目錄

你有沒有想過將你喜歡的一些檔案,利用網際網路分享給朋友?也這就是說,朋友們可以在你的網址下載這一些你想分享的檔案。

從網址讓別人下載檔案,這是 ftp(file transport protocol)通訊協定的功能。一般來說,只有管理員(root)有這個權限把檔案放在ftp的目錄裡。但是一般人平常只擁有自己的http網址。我們學校提供這種服務給每個學生。在外面有很多網際網路公司,列:Yahoo,或 ISP(Internet Service Provider:網際網路服務提供者)也提供這種服務。問題是,這種服務通常不同時提供ftp功能。

如果你把這些檔案放在你的網址,別人也無法下載除了他們已經很清楚知道這些檔案的名稱。那該怎麼辦?

如果你用的 http 伺服器是 Apache,解決的方法是在下載檔案的目錄裡寫一個 index.html。在 index.html 裡用手動的方式把檔案和檔案的連結一個一個的列出。

以下 index.html 例子是列出兩個檔案(myfile1.txt 和 myfile2.txt)和這些檔案的連結:

   <html>
   <head>
   <title>下載檔案</title>
   </head>
   <body>
   <a href="myfile1.txt">myfile1.txt</a>
   <a href="myfile2.txt">myfile2.txt</a>
   </body>
   </html>
這種方法是很麻煩的。如果你想分享的檔案很多,你可以想像得到你要花多少時間要一個一個的列出所有檔案和檔案的連結。另外一個麻煩是,每次你加入新檔案或刪除一些檔案,你就必須更改 index.html 的內容來對應目錄裡實際的檔案。

如果你想自動化這個過程的話,你可以使用 php 來寫一個 index.php 程式。php 是與微軟的 asp(Active Server Page:動態伺服器網頁)同樣具有類似的功能。

所謂動態的意思是:每次有人瀏覽到這網址, Apache 會執行 index.php 而且同時會產生 html 網頁,內容是列出目前這目錄裡面所有的檔案和子目錄,同時也產生檔案和子目錄的連結。每次執行 index.php 就會反應目錄裡面實際的檔案和子目錄。如果你加入新的檔案或刪除一些檔案也沒有關係了。已經自動化了!

php 是一種動態網頁語言。如果你已經學會了 c 語言,你算也會了 php 語言。php 的語法很像似 c 語言。很多 php 使用的函數名稱和功能跟 c 語言是一樣的。如果在你的網頁很想使用 php 的話,我建議也學 html 語法。這是必須的。如果你想設計比較複雜的網頁(如同 phpBB,我們學校使用的 BBS 軟体),也應該學 Javascript 語言。

以下是我寫的 index.php:

<?
/* 列出目錄內的檔案和目錄(除了檔案index.php)。這個檔案應該命名為
    index.php。把這個檔案放在提供下載檔案的目錄裡面。這個目錄就變
    成下載檔案的根目錄。
    蔡由世神父
*/
$date = '2002/12/21';   
echo '<html><head><meta http-equiv="Content-Type" ';
echo 'content="text/html; charset=big5">';
echo '<title>蔡神父目錄列表</title></head><body>';
/*
   為了保證所放 index.php 的目錄是根目錄,$path 不可以有 '..' 而前面一定是 './'
*/
if (($path == "") || (substr_count($path, '..') > 0) ||
   (substr($path, 0, 2)) != './') $path = './';
$tmp = substr($path, 1);
echo "<h3>Index of $tmp </h3>\n<pre>";
/*
   讀檔案/目錄列表,放入陣列 $farray/$darray
*/
$darray = $farray = array(); // 宣告 $farray 和 $darray 為陣列
$hndl = opendir("$path");
$fi = 0;
$di = 0;
/*
   開始讀這目錄裡的所有檔案和目錄
*/
while($entry = readdir($hndl)) {
   if (is_file($entry)) { // 是否檔案?
      if ($entry != 'index.php') $farray[$fi++] = $entry;
   }
   else {   // 是目錄
      if ($entry != '.') {
         if ($entry != '..' || $path != './') {
            $darray[$di++] = $entry;
         }
      }
   }
}
closedir($hndl);
/*
   列出目錄列表
*/
$didx = count($darray);
if ($didx > 0) {
   sort($darray); // 排列
   for ($i = 0; $i < $didx; $i++) {
      echo "            [";
      if ($darray[$i] == '..') {
      // 刪除最後的 '/'
         $tmp = substr($path, 0, strlen($path) - 1);
      // 尋找最後一個'/'
         $ipos = strrpos($tmp, '/');
      // 刪除最後一個目錄
         $tmp = substr($tmp, 0, $ipos+1);
         echo '<a href="index.php?path='.$tmp.'">..</a>]'."\n";
      }
      else {
         echo '<a href="index.php?path='.$path.$darray[$i].'/">'.$darray[$i].'</a>]'."\n";
      }
   }
}
/*
   列出檔案列表
*/
$fidx = count($farray);
if ($fidx > 0) {
   sort($farray); // 排列
   for ($i = 0; $i < $fidx; $i++) {
   // 讀檔案的timestamp(時間戳記)
      $idate = filemtime($farray[$i]);
   // 將timestamp轉換為date(日期)
      $sdate = date('Y/m/d', $idate);
      $fsize = filesize($farray[$i]); // 讀檔案大小
      if ($fsize < 1024) {
         printf("%7d B   ", $fsize); // 為byte
      }
      else {
         $fsize = (float) ($fsize / 1024.0);
         if ($fsize < 1024.0) {
            printf("%5.1f KB  ", $fsize);  // 為KB
         }
         else {
            $fsize /= 1024.0;
            if ($fsize < 1024.0) {
                 printf("%5.1f MB  ", $fsize);  // 為MB
            }
            else {
               $fsize /= 1024.0;
               printf("%5.1f GB  ", $fsize);  // 為GB
            }
         }
      }
      echo $sdate;
      echo '  <a href="'.$path.$farray[$i].'">'.$farray[$i].'</a>'."\n";
   }
}
echo '</pre><hr><pre><font color="#808080" size="2">';
echo '蔡由世神父'."\n";
echo $date.'</font></pre>';
echo '</body></html>';
?>
蔡由世神父
 2002/12/21