复制代码
- 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.\n") !== 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;
- }
|
这个方法的为什么要用 $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这种情况呢
可能写的有点乱