Windows下is_readable()无法判断隐藏文件,因其不检查FILE_ATTRIBUTE_HIDDEN属性;应改用attrib命令或COM对象检测,Linux/macOS则依赖文件名以点开头的约定。
Windows 下用 is_readable() 判断隐藏文件不可靠
Windows 的「隐藏」是文件属性位(FILE_ATTRIBUTE_HIDDEN),而 PHP 的 is_readable()、file_exists() 等函数默认不检查该属性,只要权限允许就返回 true。这意味着一个被标记为隐藏的文件,在 PHP 里仍可能被正常读取、列出,完全感知不到它的「隐藏身份」。
实操建议:
- 不要依赖
is_readable()或stat()的mode字段判断隐藏状态——Windows 下mode不包含隐藏属性 - 需调用系统级接口:Windows 用
cmd /c attrib或 COM 对象;Linux/macOS 隐藏靠文件名前缀.,与属性无关 - 跨平台统一处理时,优先按「文件名是否以点开头」做基础过滤,再对 Windows 单独补查属性
Windows 下用 COM 对象读取文件隐藏属性
PHP 在 Windows 上可通过 COM 扩展直接访问文件系统属性,这是最准确的方式(前提是服务器启用了 com_dotnet 扩展)。
示例代码:
立即学习“PHP免费学习笔记(深入)”;
$fso = new COM("Scripting.FileSystemObject");
$file = $fso->GetFile("C:\\test\\secret.txt");
if ($file->Attributes & 2) { // 2 = Hidden attribute
echo "是隐藏文件";
}
注意点: