php scandir() 是否排除 Windows 下的隐藏文件?
Does php scandir() exclude hidden files under Windows?
在 Windows 系统上,备份代理创建了与原始文件名称几乎相同且路径相同的临时隐藏文件。这可能扰乱了使用 PHP scandir()
.
的进程
现在我想知道 Windows 上设置了隐藏标志的文件是否被 PHP scandir()
排除了。
有一些关于Linux风格的隐藏文件的文章,scandir()
应该如何忽略以点开头的文件,但很少有关于Windows文件的信息。
简短测试表明 scandir()
和 glob()
或其他人都没有处理隐藏的标志。
这是实验和结果:
零件:
- Windows 7
- PHP 5.6.9 (x86)
- Visual Studio 2012 可再发行 x86
所以scandir()
不会隐藏设置了隐藏标志的文件。
下一个问题是,是否可以配置更强大的 PHP 命令,例如 glob()
。
首先没有处理flags的参数:
http://php.net/manual/de/function.glob.php
其次,Gabriel S. Luraschi 的评论很有说服力:
http://php.net/manual/de/function.glob.php#110510
他推荐exec('dir ... \A ...')
。但是在商业主机上(如果他们 运行 在 Windows 上),这是不允许的。
确定:使用 Linux 样式并忽略以点开头的文件,如下所示:
Exclude hidden files from scandir
我已经在 windows 7 和 windows 8 & 8.1 和 上尝试过此代码,它肯定会通过标记出来排除隐藏文件。
<?php
$location="path/to/a/folder/";
if( function_exists("scandir") ){
$file = scandir($location);
foreach($file as $this_file) {
/***Putting the condition here restricts hidden files and files starting with '.' and '~'...****/
if (is_hidden_file($location.$this_file) || $this_file == '.' || $this_file == '..' || $this_file[0]=='.' || $this_file[0]=='~' )
continue;
else {
var_dump($this_file);
}
}
}
function is_hidden_file($fn) {
$dir = "\"".$fn."\"";
$attr = trim(shell_exec("FOR %A IN (".$dir.") DO @ECHO %~aA"));
if($attr[3] === 'h')
return true;
return false;
}
?>
我看到您在问题中提到有一些方法可以排除以“.”开头的文件。和 linux 中的内容,但关于 windows 的信息非常少。然后检查一下它不仅消除了以“。”开头的文件。 & '..' 但也标记出实际隐藏的文件,并且肯定会在 windows.
中工作
在 Windows 系统上,备份代理创建了与原始文件名称几乎相同且路径相同的临时隐藏文件。这可能扰乱了使用 PHP scandir()
.
现在我想知道 Windows 上设置了隐藏标志的文件是否被 PHP scandir()
排除了。
有一些关于Linux风格的隐藏文件的文章,scandir()
应该如何忽略以点开头的文件,但很少有关于Windows文件的信息。
简短测试表明 scandir()
和 glob()
或其他人都没有处理隐藏的标志。
这是实验和结果:
零件:
- Windows 7
- PHP 5.6.9 (x86)
- Visual Studio 2012 可再发行 x86
所以scandir()
不会隐藏设置了隐藏标志的文件。
下一个问题是,是否可以配置更强大的 PHP 命令,例如 glob()
。
首先没有处理flags的参数:
http://php.net/manual/de/function.glob.php
其次,Gabriel S. Luraschi 的评论很有说服力:
http://php.net/manual/de/function.glob.php#110510
他推荐exec('dir ... \A ...')
。但是在商业主机上(如果他们 运行 在 Windows 上),这是不允许的。
确定:使用 Linux 样式并忽略以点开头的文件,如下所示:
Exclude hidden files from scandir
我已经在 windows 7 和 windows 8 & 8.1 和 上尝试过此代码,它肯定会通过标记出来排除隐藏文件。
<?php
$location="path/to/a/folder/";
if( function_exists("scandir") ){
$file = scandir($location);
foreach($file as $this_file) {
/***Putting the condition here restricts hidden files and files starting with '.' and '~'...****/
if (is_hidden_file($location.$this_file) || $this_file == '.' || $this_file == '..' || $this_file[0]=='.' || $this_file[0]=='~' )
continue;
else {
var_dump($this_file);
}
}
}
function is_hidden_file($fn) {
$dir = "\"".$fn."\"";
$attr = trim(shell_exec("FOR %A IN (".$dir.") DO @ECHO %~aA"));
if($attr[3] === 'h')
return true;
return false;
}
?>
我看到您在问题中提到有一些方法可以排除以“.”开头的文件。和 linux 中的内容,但关于 windows 的信息非常少。然后检查一下它不仅消除了以“。”开头的文件。 & '..' 但也标记出实际隐藏的文件,并且肯定会在 windows.
中工作