在Windows计算机上,以下脚本:
<?php
mkdir("c:\\[test]");
file_put_contents("c:\\[test]\\test.txt", "some content");
chdir("c:\\[test]");
echo getcwd()."\n";
var_dump(glob('*'));
?>
Run Code Online (Sandbox Code Playgroud)
显示这个:
C:\[test]
array(0) {
}
Run Code Online (Sandbox Code Playgroud)
如果这是预期的:
C:\[test]
array(1) {
[0]=>
string(8) "test.txt"
}
Run Code Online (Sandbox Code Playgroud)
据我所知,在参数中找到时,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[]]/*");
Run Code Online (Sandbox Code Playgroud)
鉴于这些复杂性,如果您在 Windows 机器上遇到问题,我建议不要使用 glob 函数,并查看其他文件列表函数,如readdir。