На компьютере с 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 .