用PHP寫一個讀取指定資料夾底下的所有檔案和資料夾的函數

/*

Reading Files in the nest directories.

讀取多重資料夾檔案

*/

function readDirs ($dirPath = "") {

if (is_dir ($dirPath)) {

// Plus / at the End place of directory path.

if (substr ($dirPath, -1, 1) != '/') $dirPath .= '/';

// Open directory

$dir = dir ($dirPath);

// Get the name of current directory.

$current_dir = basename ($dir_path);

// Read informaitons of the directory.

while ($entry = $dir->read ()) {

// Exclude ., .., Thumbs.db and desktop.ini

if (!($entry == '.' || $entry == '..' || $entry == 'Thumbs.db' || $entry == 'desktop.ini')) {

// Identify the data is directory or file.

if (is_dir ($dir->path.$entry)) {

$dirs[$current_dir]['dir'][] = $entry;

readDirs ($dir->path.$entry.'/', $dirArr);

}

else if (is_file ($dir->path.$entry)) {

$dirs[$current_dir]['file'][] = $entry;

}

else echo "This is not a directory or file.";

}

}

$dir->close ();

// return an array with result of reading directories.

return $dirs;

}

else echo "This is not a directory's path!";

}

上面是我寫的一個函數,用來讀取指定資料夾底下的所有檔案與子資料夾的一切,並且將結果儲存在一個多維陣列中,然後將其回傳。

可是回傳的結果都只有存到指定資料夾下的檔案和資料夾,其子資料夾的東西則一個都沒有…

我試過在函數中 return $dirs; 敘述之前讀取陣列之值,發現陣列有存到相關的資料,可是到了外部使用時又沒有了…

在下試了好久都找不到問題所在,雖然猜測問題應該出在 return $dirs. 這一敘述上,可是對於 recursive function 的觀念,說實在的,本菜鳥實在是不太明暸…

還請路過的高手幫我解惑一下!

Update:

不好意思,因為我想要將取得的資訊存到一個變數給其他的函數使用,可是卻一直卡在這一點上。

能再請教一下,這方面的作法嗎?

1 Answer

Rating
  • 1 decade ago
    Favorite Answer

    您的問題要用遞迴的觀念才行!

    一個簡單的範例如下示:

    <?php

    function open_dir($dir , $new_line = '<br />'){

    $d = dir($dir);

    while($row = $d->read()){

    if($row != '.' && $row !='..'){

    $path = $dir . '/' .$row;

    echo $row . $new_line;

    if(is_dir($path))

    open_dir($path , $new_line);

    $path = '';

    }

    }

    $d->close();

    }

    open_dir(".");

    ?>

    關鍵就在下述的部份:

    if(is_dir($path))

    open_dir($path);

    其意則是:

    若是資料夾的話,

    即使用open_dir再次開啟本資料夾!

    而open_dir的第二個參數是傳入換行符號,

    預設為HTML的<br />,

    若使用PHP CLI 模式使用可傳入"\n"。

    2008-02-19 09:39:22 補充:

    read()){

    if($row != '.' && $row !='..'){

    $path = $dir . '/' .$row;

    $dir_ary[] = $row;

    if(is_dir($path))

    $dir_ary[] = open_dir($path);

    $path = '';

    }

    }

    $d->close();

    return $dir_ary;

    }

    ?>

    2008-02-19 09:44:32 補充:

    補充內容有不全!

    1.請改function 為function open_dir($dir)

    2.$d = dir($dir);的下方必需多新增$dir_ary = array();

    3.while迴圈內的

    echo $row . $new_line;

    if(is_dir($path))

    open_dir($path , $new_line);

    改成

    $dir_ary[] = $row;

    if(is_dir($path))

    $dir_ary[] = open_dir($path);

    不好意思囉!

    明明補充就全貼上了,

    內容變成上面那樣不全的文章!

    2008-02-19 09:45:34 補充:

    4.最後在function結束前請補上return $dir_ary;

    Source(s): 自己, 自己, 自己, 自己
Still have questions? Get your answers by asking now.