2011-12-02 55 views
6

在Windows机器上,下面的脚本:PHP水珠()在括号目录

<?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将括号视为特殊字符,在中找到时参数。

模式*匹配当前工作目录中的任何文件。然而,水珠() 的行为就好像它是与模式c:\\[test]\\*

括号,然后被解释为模式的一部分,而事实上,他们 是目录的一部分运行。

glob应该治疗路径作为模式的一部分吗?我宁愿认为它应该使用当前目录作为起点,然后仅处理模式

(试图总结):该glob功能就像它的越来越c:\\[test]\\*作为匹配模式,并试图要匹配c:\t\*c:\e\*,或者c:\s\*。但模式实际上是*,它不应该试图匹配任何。

+0

我不能在Mac上复制它,你可以检查目录和文件是否真的在你的窗口上正确创建? – ajreal

+2

我可以建议明显的,不要在目录名称中使用[]吗? – 2011-12-02 04:25:45

+2

@Dagon为什么[]不能用于目录名称? – xdazz

回答

4

这似乎是作为覆盖php.net上这个bug报告中的问题:https://bugs.php.net/bug.php?id=33047

在该线程的最后一个职位是它不是一个bug,而是从如何对待水珠括号中的问题,因为正则表达式的一部分。我不确定我是否同意。看来你可以解决这个问题,除非你不能进入父文件夹。

如果删除的在里面[测试]文件夹中是第一位的,你可以通过使用一个语法像下面得到的文件清单:

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

鉴于这些并发症,我会建议不使用glob函数,如果您遇到Windows计算机上的问题,并查看其他文件列表功能,如readdir

+1

这并不是真正的“结论”,它只是迄今发布的最后一条评论,除非我错过了某些评论是错误的。无论如何,它看起来像一个有效的错误报告,虽然它已经关闭没有修复。 –

+1

好点,我会编辑我的帖子。 –