PHP glob () в скобках

На компьютере с Windows следующий скрипт:

<?php mkdir("c:\\[test]"); file_put_contents("c:\\[test]\\test.txt", "some content"); chdir("c:\\[test]"); echo getcwd()."\n"; var_dump(glob('*')); ?> 

Отображает это:

 C:\[test] array(0) { } 

Когда это ожидается:

 C:\[test] array(1) { [0]=> string(8) "test.txt" } 

Я понимаю, что glob рассматривает скобки как специальные символы, когда их можно найти в параметре pattern .

Шаблон * соответствует любому файлу в текущем рабочем каталоге. Однако glob () ведет себя так, как если бы он запускался с шаблоном c:\\[test]\\*

Скобки затем интерпретируются как часть шаблона, когда на самом деле они являются частью каталога.

Предполагается ли, что glob рассматривает путь как часть шаблона ? Я бы предпочел, чтобы он использовал текущий каталог в качестве отправной точки, а затем обрабатывал только шаблон .

(Попытка обобщить): Функция glob действует так, как будто она получает c:\\[test]\\* в качестве шаблона соответствия и пытается сопоставить либо c:\t\* , c:\e\* , либо c:\s\* . Но шаблон на самом деле * и он не должен пытаться соответствовать ни одному из них.

Это, похоже, рассматривается как проблема в этом отчете об ошибке на php.net: https://bugs.php.net/bug.php?id=33047

Последнее сообщение в этом потоке об этом не является ошибкой, но проблема в том, как glob рассматривает скобки, как часть регулярного выражения. Я не уверен, что согласен. Кажется, вы можете обойти это, если только вы не можете переместиться в родительскую папку.

Если вы удалите первое требование наличия во внутренней папке [test], вы можете получить список файлов, используя синтаксис, как показано ниже:

 chdir('..'); $glob = glob("[[]test[]]/*"); 

Учитывая эти осложнения, я бы рекомендовал не использовать функцию glob, если вы столкнулись с проблемами на машинах Windows, и посмотрите на другие функции перечисления файлов, такие как readdir .