ecshop 文件或目录权限检查函数 问题

复制代码
  1. function file_mode_info($file_path)
  2. {
  3.     /* 如果不存在,则不可读、不可写、不可改 */
  4.     if (!file_exists($file_path))
  5.     {
  6.         return false;
  7.     }
  8.     $mark = 0;
  9.     if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
  10.     {
  11.         /* 测试文件 */
  12.         $test_file = $file_path . '/cf_test.txt';
  13.         /* 如果是目录 */
  14.         if (is_dir($file_path))
  15.         {
  16.             /* 检查目录是否可读 */
  17.             $dir = @opendir($file_path);
  18.             if ($dir === false)
  19.             {
  20.                 return $mark; //如果目录打开失败,直接返回目录不可修改、不可写、不可读
  21.             }
  22.             if (@readdir($dir) !== false)
  23.             {
  24.                 $mark ^= 1; //目录可读 001,目录不可读 000
  25.             }
  26.             @closedir($dir);
  27.             /* 检查目录是否可写 */
  28.             $fp = @fopen($test_file, 'wb');
  29.             if ($fp === false)
  30.             {
  31.                 return $mark; //如果目录中的文件创建失败,返回不可写。
  32.             }
  33.             if (@fwrite($fp, 'directory access testing.') !== false)
  34.             {
  35.                 $mark ^= 2; //目录可写可读011,目录可写不可读 010
  36.             }
  37.             @fclose($fp);
  38.             @unlink($test_file);
  39.             /* 检查目录是否可修改 */
  40.             $fp = @fopen($test_file, 'ab+');
  41.             if ($fp === false)
  42.             {
  43.                 return $mark;
  44.             }
  45.             if (@fwrite($fp, "modify test.\n") !== false)
  46.             {
  47.                 $mark ^= 4;
  48.             }
  49.             @fclose($fp);
  50.             /* 检查目录下是否有执行rename()函数的权限 */
  51.             if (@rename($test_file, $test_file) !== false)
  52.             {
  53.                 $mark ^= 8;
  54.             }
  55.             @unlink($test_file);
  56.         }
  57.         /* 如果是文件 */
  58.         elseif (is_file($file_path))
  59.         {
  60.             /* 以读方式打开 */
  61.             $fp = @fopen($file_path, 'rb');
  62.             if ($fp)
  63.             {
  64.                 $mark ^= 1; //可读 001
  65.             }
  66.             @fclose($fp);
  67.             /* 试着修改文件 */
  68.             $fp = @fopen($file_path, 'ab+');
  69.             if ($fp && @fwrite($fp, '') !== false)
  70.             {
  71.                 $mark ^= 6; //可修改可写可读 111,不可修改可写可读011...
  72.             }
  73.             @fclose($fp);
  74.             /* 检查目录下是否有执行rename()函数的权限 */
  75.             if (@rename($test_file, $test_file) !== false)
  76.             {
  77.                 $mark ^= 8;
  78.             }
  79.         }
  80.     }
  81.     else
  82.     {
  83.         if (@is_readable($file_path))
  84.         {
  85.             $mark ^= 1;
  86.         }
  87.         if (@is_writable($file_path))
  88.         {
  89.             $mark ^= 14;
  90.         }
  91.     }
  92.     return $mark;
  93. }

这个方法的为什么要用 $mark ^= 1;这个形式来赋值,而不是具体的= 某个值,看上去也比较直观。
还有可写,和可修改,两个概念有啥区别?网上看一下啊,说是修改有删除权限,写入没有。是这样吗?

还有这行
/* 试着修改文件 */
$fp = @fopen($file_path, 'ab+');
if ($fp && @fwrite($fp, '') !== false)
{
$mark ^= 6; //可修改可写可读 111,不可修改可写可读011...
}
//可修改可写可读 111,不可修改可写可读011... 怎么会有这种情况呢》?
如果这里为ture $mark 那么值是111,如果为false ,$mark 不是就上面的($mark ^= 1; //可读 001,不可读 000),怎么会有011这种情况呢


可能写的有点乱

作者: 二点水   发布时间: 2011-09-22

怎么就没人回复啊

作者: 二点水   发布时间: 2011-09-22