ID:               33047
 Comment by:       tommytompkins at redcart dot com
 Reported By:      wiseman1024 at gmail dot com
 Status:           No Feedback
 Bug Type:         Directory function related
 Operating System: Windows 2000
 PHP Version:      4.3.9
 New Comment:

This actually is not a bug.  The glob() function is an extension of the
Unix glob function and square brackets have special meaning with that
function.

More information on the Unix glob() function can be found here:

http://unixhelp.ed.ac.uk/CGI/man-cgi?glob

Since brackets have special meaning with that function, you need to put
brackets around the brackets.  For example you could do this as a work
around:

/* First, replace all brackets with an escaped bracket */
$escapedBracketPath = str_replace('[', '\[', $path);
$escapedBracketPath = str_replace(']', '\]', $escapedBracketPath);
   
/* Next, replace all "escaped" brackets with brackets like so */
$escapedBracketPath = str_replace('\[', '[[]', $escapedBracketPath);
$escapedBracketPath = str_replace('\]', '[]]', $escapedBracketPath);
   
$normal_files = glob($escapedBracketPath . "*");
$hidden_files = glob($escapedBracketPath . "\.?*");


Previous Comments:
------------------------------------------------------------------------

[2007-09-18 15:42:26] rele at gmx dot de

This bug has still not been fixed, I tested it with PHP 5.2.4 on WinXP
SP 2.

In addition the bug occurs when the glob pattern parameter contains a
directory path containing non-empty brackets.

And in contrary to the workaround mentioned in the manual, escaping
does not change anything.
http://www.php.net/manual/en/function.glob.php#76621


chdir('C:\\');
$dir = 'C:\a[test]';
$dir_escaped = 'C:\a\[test\]';
print_r(glob($dir . DIRECTORY_SEPARATOR . '*'));
print_r(glob($dir_escaped . DIRECTORY_SEPARATOR . '*'));

------------------------------------------------------------------------

[2006-02-16 23:52:50] ian at res-alian dot com

Argh. I forgot to add sort($picfns) for good measure, since readdir()
returns entries in the order they appear on the hard drive while glob()
returns them sorted (unless using the GLOB_NOSORT flag). If the PHP
developers fix the glob() Win32 bug, I can stop ranting.... =)

--i;

------------------------------------------------------------------------

[2006-02-16 23:19:14] ian at res-alian dot com

Here's my workaround code, using opendir() and readdir() (using code
from the readdir() page on this site):

    if ($dirh = opendir("."))
    {
      $picfns = 0;

      while (false !== ($file = readdir($dirh)))
      {
        if (preg_match("/^_.*jpg$/", $file))
        {
          $file = preg_replace("/^_/", "", $file);

          if ($picfns)
          {
            array_push($picfns, $file);
          }
          else
          {
            $picfns = array($file);
          }
        }
      }

      closedir($dirh);
    }

replaces this code:

    $thumbfns = glob("_*.jpg");
    $jpgfns = glob("*.jpg");
    $picfns = array_diff($jpgfns, $thumbfns);

--i;

------------------------------------------------------------------------

[2006-02-16 18:41:20] ian at res-alian dot com

I get the same problem with glob() using PHP 5.0.2 and 5.1.2 in Windows
2000 (my work computer, NTFS) and in Windows XP (notebook, 5.0.5, NTFS)
but not Linux (server, 5.0.2, ext3). Sorry I can't offer a solution
other than using Linux. I'm not sure if it has to do with the NTFS file
system.

It took me a while to figure out why some folders didn't work, and I
thought it was a permission thing. When I noticed the folder that worked
had no bracket, I tried adding brackets, and that made it not work.
(Also removing the brackets made ones with brackets suddenly work.) Then
I knew what to look for and found this bug entry with Google.

What's strange is that glob() has no problem returning a list with some
entries containing brackets, but not any entries at all when within a
folder with brackets.

The other strange thing is the opendir() and readdir() work fine in the
same situation under Windows. It's more inconvenient but serves as a
workaround.

--i;

------------------------------------------------------------------------

[2005-05-25 01:00:04] php-bugs at lists dot php dot net

No feedback was provided for this bug for over a week, so it is
being suspended automatically. If you are able to provide the
information that was originally requested, please do so and change
the status of the bug back to "Open".

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/33047

-- 
Edit this bug report at http://bugs.php.net/?id=33047&edit=1

Reply via email to