Search code examples
phpcommand-line-interfacedirectory-listing

Why does opendir not show folders with a single integer as the name


I have a script that opens a directory, checks if the folders matches an array, and then opens them. In the directory there is a list of folders like "apache2-50", but when the script opens that folder, it only displays the .DS_Store file. Here is the output:

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

But here is the directory listing:

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

Now what I am trying to figure out why my php script is not showing those folders. When I change the folder "0" to "3" it works:

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

Here is the code that I am running:

#!/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";
                }
            }
        }
    }
}

Could this be something wong with my script, or a bug in php(PHP 5.3.3)? Thanks


Solution

  • This is a (very nasty) side effect of the string "0" evaluating to false in PHP. When that happens, your while loop

    while($file = readdir($dir))
    

    will break.

    This should work, because it breaks only when readdir() actually returns false:

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

    (obviously, change both loops accordingly, not just the outer one.)