PHP glob()函数无法找到.htaccess文件。

5

简单的问题 - 如何使用 glob() 列出 .htaccess 文件?

2个回答

12

glob()函数可以列出“隐藏”的文件(以.开头的文件,包括目录...),但只有在显式请求时才会列出:

 glob(".*");

使用preg_grep过滤glob()数组中的 .htaccess 条目:

 $files = glob(".*") AND $files = preg_grep('/\.htaccess$/', $files);

当然,替代glob的方法是使用scandir()和一个过滤器(fnmatch或正则表达式):

 preg_grep('/^\.\w+/', scandir("."))

实际的特殊之处在于PHP不仅使glob.h系统调用常量GLOB_PERIOD可用。因此,这更像是一种绕过方式。 - mario
是的,我添加了代码,使用那个参数值格式获取以点开头的文件很长。我想知道为什么这个常量没有被集成。难道是因为Windows喜欢这样吗? - hakre
我只会称之为一个错误。让我们来看一个实际的用例:删除文件夹中的所有文件,包括点文件:array_map('unlink', glob(__DIR__."/*/folder/*.*"));。预期结果:所有文件都被删除了-但这不起作用。简单的通配符也不起作用:array_map('unlink', glob(__DIR__."/*/scripts/webinterface/*"));。必须将glob模式组合起来匹配两者:{.*,*.*}(点文件+所有文件)。我猜,如果我将其归类为错误,我会得到预期的行为作为响应并直接关闭... =)。 - Jens A. Koch

0

如果有人来到这里,

由于PHP中实现了SPL并提供了一些很酷的迭代器,你可以利用它来列出你的隐藏文件,比如.htaccess文件或者它的替代隐藏Linux文件。

使用DirectoryIterator来列出所有目录内容,并排除...,如下所示:

$path = 'path/to/dir';
$files = new DirectoryIterator($path);

foreach ($files as $file) {
    // excluding the . and ..
    if ($file->isDot() === false) {
        // make some stuff
    }
}

我认为我将采用这种方法来完成我的当前项目,但是...我有一些担忧:http://php.net/manual/en/class.directoryiterator.php#122474 你有遇到过类似的障碍吗? - mickmackusa
刚在我的wamp上运行了一些测试,->isDot()正在吞噬我的.htaccess文件和.以及..。也许如果有人希望全面调查并在手册中发布一个注释,这将有助于未来的研究人员。http://php.net/manual/en/directoryiterator.isdot.php 对于...的字面检查似乎是必要的。 - mickmackusa
你有遇到类似的障碍吗?没有,你的代码在我测试的安装了PHP5.6的Windows服务器上运行正常,除了你那种情况下的....DB_STORE文件,也不会排除 .htaccess文件。 - hassan
将您的代码应用于具有以下内容的目录“.htaccess.DB_STOREa.htaccess”,会产生以下输出:https://i.imgur.com/fWWCTa9.png - hassan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接