在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\*
或{ {1}}。但该模式实际上是c:\s\*
,它不应该试图匹配其中任何一个。
答案 0 :(得分:4)
这似乎是关于php.net上的错误报告中的一个问题:https://bugs.php.net/bug.php?id=33047
该主题的最后一篇文章是关于它不是一个bug,而是一个关于glob如何处理括号的问题,作为正则表达式的一部分。我不确定我是否同意。看起来你可以解决这个问题,除非你不能进入父文件夹。
如果您删除了位于[test]文件夹内的第一个要求,则可以使用以下语法获取文件列表:
chdir('..');
$glob = glob("[[]test[]]/*");
鉴于这些复杂情况,如果您在Windows机器上遇到问题,我建议不要使用glob函数,并查看其他文件列表函数,如readdir。