- /**
- * 文件或目录权限检查函数
- *
- * @access public
- * @param string $file_path 文件路径
- * @param bool $rename_prv 是否在检查修改权限时检查执行 rename() 函数的权限
- *
- * @return int 返回值的取值范围为 {0 <= x <= 15}, 每个值表示的含义可由四位二进制数组合推出
- * 返回值在二进制计数法中, 四位由高到低分别代表
- * 可执行 rename() 函数权限可对文件追加内容权限可写入文件权限可读取文件权限
- */
- function file_mode_info($file_path)
- {
- /* 如果不存在, 则不可读不可写不可改 */
- if (!file_exists($file_path))
- {
- return false;
- }
- $mark = 0;
- if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
- {
- /* 测试文件 */
- $test_file = $file_path . '/cf_test.txt';
- /* 如果是目录 */
- if (is_dir($file_path))
- {
- /* 检查目录是否可读 */
- $dir = @opendir($file_path);
- if ($dir === false)
- {
- return $mark; // 如果目录打开失败, 直接返回目录不可修改不可写不可读
- }
- if (@readdir($dir) !== false)
- {
- $mark ^= 1; // 目录可读 001, 目录不可读 000
- }
- @closedir($dir);
- /* 检查目录是否可写 */
- $fp = @fopen($test_file, 'wb');
- if ($fp === false)
- {
- return $mark; // 如果目录中的文件创建失败, 返回不可写
- }
- if (@fwrite($fp, 'directory access testing.') !== false)
- {
- $mark ^= 2; // 目录可写可读 011, 目录可写不可读 010
- }
- @fclose($fp);
- @unlink($test_file);
- /* 检查目录是否可修改 */
- $fp = @fopen($test_file, 'ab+');
- if ($fp === false)
- {
- return $mark;
- }
- if (@fwrite($fp, "modify test.rn") !== false)
- {
- $mark ^= 4;
- }
- @fclose($fp);
- /* 检查目录下是否有执行 rename() 函数的权限 */
- if (@rename($test_file, $test_file) !== false)
- {
- $mark ^= 8;
- }
- @unlink($test_file);
- }
- /* 如果是文件 */
- elseif (is_file($file_path))
- {
- /* 以读方式打开 */
- $fp = @fopen($file_path, 'rb');
- if ($fp)
- {
- $mark ^= 1; // 可读 001
- }
- @fclose($fp);
- /* 试着修改文件 */
- $fp = @fopen($file_path, 'ab+');
- if ($fp && @fwrite($fp, '') !== false)
- {
- $mark ^= 6; // 可修改可写可读 111, 不可修改可写可读 011...
- }
- @fclose($fp);
- /* 检查目录下是否有执行 rename() 函数的权限 */
- if (@rename($test_file, $test_file) !== false)
- {
- $mark ^= 8;
- }
- }
- }
- else
- {
- if (@is_readable($file_path))
- {
- $mark ^= 1;
- }
- if (@is_writable($file_path))
- {
- $mark ^= 14;
- }
- }
- return $mark;
- }
来源: https://www.php1.cn/detail/php-cf983040c9.html