2010-06-08 127 views
3

我正在嘗試製作掃描子文件夾的文件夾的函數,然後用這些文件夾的名稱返回 數字數組。is_dir無法識別文件夾

這是我用於測試的代碼。一旦我把它打印出來的文件夾名稱,而不只是「。」和「..」爲目前和以上的文件夾都會很好,我可以完成該功能。

<?php 
function super_l_getthemes($dir="themes") 
{ 

if ($handle = opendir($dir)) { 
    echo "Handle: {$handle}\n"; 
    echo "Files:\n"; 


    while (false !== ($file = readdir($handle))) { 
     echo "{$file}<br>"; 
    } 

    closedir($handle); 
} 
?> 

上面的代碼工作正常,並打印出文件夾的所有內容:文件,子文件夾和「。」。和 「..」

,但如果我更換:

while (false !== ($file = readdir($handle))) { 
     echo "{$file}<br>"; 
    } 

着: 「」

while (false !== ($file = readdir($handle))) { 
     if(file_exists($file) && is_dir($file)){echo "{$file}";} 
    } 

功能只打印和「..」,而不是我希望打印的兩個文件夾名稱。

任何幫助表示讚賞。

+1

請編輯您的問題,以便代碼可讀 – jigfox 2010-06-08 14:04:17

+0

感謝您的調節,使代碼可讀。上次我在我的帖子中添加了代碼時,它說我的權限太少,無法添加代碼。試圖把它包含在php中,但它仍然只是將代碼作爲代碼進行識別。 – Rakoon 2010-06-08 14:11:01

回答

5

您必須提供到file_exists的絕對路徑,否則它會在當前執行路徑中查找它。

while (false !== ($file = readdir($handle))) { 
    $file_path = $dir . DIRECTORY_SEPARATOR . $file; 
    if (file_exists($file_path) && is_dir($file_path)) { 
     echo "{$file}"; 
    } 
} 
+2

不需要那裏的報價。 'echo $ file'工作得很好。另外,無論如何,變量插值對雙引號都有效,所以你也不需要大括號。 – 2010-06-08 14:15:21

+0

變量插值對我來說是一個新詞,但是,我看到代碼在沒有大括號的情況下執行相同。 (查找可變插值) 感謝您的快速回答,該代碼現在可用。 – Rakoon 2010-06-08 14:25:01

+0

如果你沒有使用大括號,也可以不用引號,這是a.t.m.只是不必要的一步。 – Wrikken 2010-06-08 14:28:07

1

您需要使用:

while (false !== ($file = readdir($handle))) { 
    if(file_exists($dir.'/'.$file) && is_dir($dir.'/'.$file)){echo "{$file}";} 
} 

http://php.net/readdir

+0

感謝您的回覆,看起來像上面兩個答案的另一個版本。 – Rakoon 2010-06-08 14:26:51

0

我不認爲你需要同時file_existsis_dir

你只需要is_dir功能。從手冊:

is_dir如果文件名存在並且是目錄,則返回TRUE,否則返回FALSE。

使用此:

while (false !== ($file = readdir($handle))) { 
     if(is_dir($file)){echo "{$file}";} 
    } 

is_dir還將檢查它是否是一個相對路徑或絕對路徑。

+1

我不確定是誰決定讓我失望,但這是有效的。我已經在我的本地apache服務器上測試過了。 – Cetra 2010-06-08 14:22:35

+0

它測試腳本當前工作目錄中的目錄是否存在,而不管打開了什麼目錄「$ handle」。它不*按預期工作。 – amphetamachine 2010-06-08 22:46:58

+0

試着打開'$ handle'到一個不是當前文件夾的目錄。 – amphetamachine 2010-06-10 22:41:38

3

readdir的問題在於它只讀取目錄中指定條目的字符串。例如,如果在目錄「/ path/to/files /」中有文件「foo」,那麼在「/ path/to/files /」上使用readdir時,最終會得到字符串「foo 」。

通常情況下,如果它與腳本的當前工作目錄位於同一目錄中,但由於您正在從任意導向器讀取數據,所以當您試圖檢查條目(文件,目錄,無論),你打電話給is_dir裸字符串「foo」。

我會嘗試使用readdir與文件的路徑前綴名稱。


if ($handle = opendir($dir)) { 
    echo "Handle: {$handle}\n"; 
    echo "Files:\n"; 

    while ($file = readdir($handle)) { 
     /*** make $file into an absolute path ***/ 
     $absolute_path = $dir . '/' . $file; 

     /*** NOW try stat'ing it ***/ 
     if (is_dir($absolute_path)) { 
      /* it's a directory; do stuff */ 
     } 
    } 

    closedir($handle); 
} 
+0

這和上面的答案都適用。感謝您的快速回復。 – Rakoon 2010-06-08 14:25:45

0
$files = array(); 
foreach(new DirectoryIteraror('/path') as $file){ 
    if($file->isDir() /* && !$file->isDot()*/) $files[] = $file->getFilename(); 
} 

[編輯:雖然你想跳過點評論說出來)

1

如果你只是想啓動文件夾的目錄,你可以簡單地做:

glob('/some/path/to/search/in/*', GLOB_ONLYDIR); 

這將給你只有在數組中的文件夾名稱。如果你想低於給定路徑中的所有目錄,嘗試SPL's RecursiveDirectoryIterator

$fileSystemIterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('/some/path/to/look/in'), 
    RecursiveIteratorIterator::SELF_FIRST); 

迭代器可以與foreach使用:

$directories = array(); 
foreach($fileSystemIterator as $path => $fileSystemObject) { 
    if($fileSystemObject->isDir()) { 
     $directories[] = $path; 
    } 
} 

然後,您將有一個數組$directories給定的路徑下的所有目錄。

-2

我同意nuqqsa的解決方案,但是,我想添加一些內容。

不是指定路徑,而是改變當前目錄。

例如,

// open directory handle 
// .... 
chdir($dir); 
while (false !== ($file = readdir($handle))) 
if(is_dir($file)) 
    echo $file; 
// close directory handle 
+1

這最終是不好的做法;在PHP執行路徑中的任何地方調用'chdir'將會改變腳本執行其餘部分*整個*的當前工作目錄。 I.E.如果foo.php包含執行'chdir'的bar.php,它會在bar.php包含後改變foo.php中所有內容的工作目錄。 – amphetamachine 2010-06-08 22:55:12

0
 $directory = scandir($path); 
      foreach($directory as $a){ 
       if(is_dir($path.$a.'/') && $a != '.' && $a != '..'){ 
       echo $a.'<br/>';   
       } 
      } 

隨着給出所示的路徑,它顯示存在於路徑中的文件夾。