Почему opendir не показывает папки с одним целым числом в качестве имени - PullRequest
0 голосов
/ 28 января 2011

У меня есть скрипт, который открывает каталог, проверяет, соответствуют ли папки массиву, а затем открывает их. В каталоге есть список папок типа «apache2-50», но когда скрипт открывает эту папку, он отображает только файл .DS_Store. Вот вывод:

This-is-not-a-MacBook:backend code archangel$ php -f frolic.php "/Users/archangel/Desktop/Httpbench Files/results"
Test Found apache2 in directory /Users/archangel/Desktop/Httpbench Files/results/apache2-50
--/Users/archangel/Desktop/Httpbench Files/results/apache2-50/.DS_Store

Но вот список каталогов:

This-is-not-a-MacBook:apache2-50 archangel$ ls
0   1   2

Теперь я пытаюсь выяснить, почему мой php-скрипт не показывает эти папки. Когда я меняю папку «0» на «3», она работает:

This-is-not-a-MacBook:apache2-50 archangel$ ls
1   2   3

This-is-not-a-MacBook:backend code archangel$ php -f frolic.php "/Users/archangel/Desktop/Httpbench Files/results"
Test Found apache2 in directory /Users/archangel/Desktop/Httpbench Files/results/apache2-50
--/Users/archangel/Desktop/Httpbench Files/results/apache2-50/.DS_Store
--/Users/archangel/Desktop/Httpbench Files/results/apache2-50/1
--/Users/archangel/Desktop/Httpbench Files/results/apache2-50/2
--/Users/archangel/Desktop/Httpbench Files/results/apache2-50/3

Вот код, который я запускаю:

#!/bin/php

//...

$dir = opendir($argv[1]);
//Opened the directory;

while($file = readdir($dir)){
//Loops through all the files/directories in our directory;
    if($file!="." && $file != ".."){
        $f = explode("-", $file);
        if(in_array($f[0], $servers) and in_array($f[1], $tests)) {
            echo "Test Found $f[0] in directory $argv[1]/$f[0]-$f[1]\n";
            $sdir = opendir("$argv[1]/$f[0]-$f[1]");
            while($sfile = readdir($sdir)){
                if($sfile!="." && $sfile != ".."){
                    echo "--$argv[1]/$f[0]-$f[1]/$sfile\n";
                }
            }
        }
    }
}

Может ли это быть что-то не так с моим скриптом или ошибка в php (PHP 5.3.3)? Спасибо

Ответы [ 3 ]

2 голосов
/ 28 января 2011

Это (очень неприятный) побочный эффект строки "0", равной false в PHP. Когда это произойдет, ваша while петля

while($file = readdir($dir))

сломается.

Это должно работать, потому что оно прерывается только тогда, когда readdir() действительно возвращает false:

while(($file = readdir($dir)) !== false)

(очевидно, соответственно измените оба цикла, а не только внешний.)

1 голос
/ 28 января 2011

Почему вы вообще используете opendir?Я думаю, что glob будет немного проще в использовании:

$files = glob("$argv[1]/*-*/*");

foreach($files as $file) {
    $parts = explode("/", $file);

    // get the directory part
    $f = explode("-", $parts[count($parts) - 2]);

    if(in_array($f[0], $servers) and in_array($f[1], $tests)) {
        echo "Test Found $f[0] in directory $argv[1]/$f[0]-$f[1]\n";
        echo "--$argv[1]/$f[0]-$f[1]/$sfile\n";
    }
}
0 голосов
/ 28 января 2011

Заменить

while($sfile = readdir($sdir)){

с

while(($sfile = readdir($sdir)) !== 0){

В противном случае, если имя файла равно 0, $ sfile равно "0", что переводится в false. Используя! == или ===, вы принудительно проверяете тип между переменными, так что "0" не равно 0.

...