• PHP文件系统概述


    >> 本文固定链接: http://php.ncong.com/php_course/file/wenjianxitong.html

    >> 转载请注明:  2014年08月08日 于 恩聪PHP学习教程 发表

    文件类型

      PHP是以UNIX的文件系统为模型的,因此在Windows系统中我们只能获得“file”、“dir”或者“unknown”三中文件类型。而在UNIX系统中,我们可以获得“block”、“char”、“dir”、“fifo”、“file”、“link”和“unknown”7种类型,各文件类型的详细说明如下表所示:UNIX系统中7种文件类型说明

      在PHP中可以使用filetype()函数获取文件的上述类型,该函数接受一个文件名作为参数,如果文件不存在将返回FALSE。下面的程序是判断文件类型的示例,代码如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
        //获取Linux系统下的文件类型    
        echo filetype('/etc/passwd');      //输出file,/etc/passwd为普通文件
        echo filetype('/etc/grub.conf');       //输出lilnk,/etc/grub.conf为连接文件-->/boot/grub/grub.conf
        echo filetype('/etc/');            //输出dir,/etc/为一个目录,即文件夹
        echo filetype('/dev/sda1');          //输出block,/dev/sda1为块设备,它是一个分区
        echo filetype('/dev/tty01');          //输出char,为字符设备,它是一个字符终端
     
        //获取windows系统下文件类型
        echo filetype("C:\WINDOWS\php.ini");    //输出file,C:\WINDOWS\php.ini为一个普通文件
        echo filetype("C:\WINDOWS");              //输出dir,C:\WINDOWS为一个文件夹(目录)
    ?>
      对于一个已知的文件,还可以使用is_file()函数判断给定的文件名是否为一个正常的文件。和它类似,使用is_dir()函数判断给定的文件名是否是同一个目录,使用is_link()函数判断给定的文件名是否为一个符号连接。
     
      文件的属性
     
      在进行编程时,需要使用到文件的一些常见属性,如文件的大小、文件的类型、文件的修改时间、文件的访问时间和文件的权限等。PHP中提供了非常全面的用来获取这些属性的内置函数,如下表所示:PHP的文件属性处理函数

      在表中的函数都需要提供同样的字符串参数,即一个指向文件或目录的字符串变量。PHP将缓存这些函数的返回信息以提供更快的性能。然而在某些情况下,你可能想清楚被缓存的信息。例如,如果在一个脚本中多次检查同一个文件,而该文件在此脚本执行期间有被删除或修改的危险时,你需要清楚文件状态缓存。在这种情况下,可以用clearstatcache()函数来清楚被PHP缓存的该文件信息。clearstatcache()函数缓存特定文件名的信息,因此只在对同一个文件名进行多次操作,并且需要该文件信息不被缓存时才需要调用它。下面的程序中通过调用这些函数获取文件大部分属性。代码如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    <?php
        //声明一个函数,通过传入一个文件名称获取文件大部分属性
        function getFilePro($fileName){
            //如果提供的文件或目录不存在,则直接退出函数
            if(!file_exists($fileName)){
                echo "目标不存在!!<br>";
                return;
            }
     
            //判断是否是一个普通文件,如果是则条件成立
            if(is_file($fileName))
                echo $fileName."是一个文件<br>";
     
            //判断是否是一个目录
            if(is_dir($fileName))
                echo $fileName."是一个目录<br>";
     
            //用定义的函数输出文件形态
            echo "文件形态:".getFileType($fileName)."<br>";
            //获取文件大小,并自定义转换单位
            echo "文件大小:".getFileSize(filesize($fileName))."<br>";
     
            if(is_readable($fileName))      //判断提供的文件是否可以读取内容
               echo "文件可读<br>";
            if(is_writable($fileName))      //判断提供的文件是否可以改写
               echo "文件可写<br>";
            if(is_executable($fileName))      //判断提供的文件是否有执行的权限
               echo "文件可执行<br>";
     
            echo "文件建立时间:".date("Y年m月j日",filectime($fileName))."<br>";
            echo "文件最后更新的时间:".date("Y年m月j日",filemtime($fileName))."<br>";
            echo "文件最后打开时间:".date("Y年m月j日",fileatime($fileName))."<br>";
        }
     
        //声明一个函数用来返回文件的类型
        function getFileType($fileName){
            //通过filetype()函数返回的文件类型作为选择条件
            switch(filetype($fileName)){
                case 'file': $type .= "普通文件";   break;
                case 'dir': $type .= "目录文件";   break;
                case 'block': $type .= "块设备文件";   break;
                case 'char': $type .= "字符设备文件";   break;
                case 'fifo': $type .= "命名管道文件";   break;
                case 'link': $type .= "符号连接";   break;
                case 'unknown': $type .= "未知类型";   break;
                default:     $type .="没有检测到类型";
            }
            return $type;       //返回转换后的类型
        }
     
        //自定义一个文件大小单位转换函数
        function getFileSize($bytes){
            if($bytes >= pow(2,40)){           //如果提供的字符数大于等于2的40次方
                $return = round($bytes/pow(1024,4),2);        //将字节大小转换为同等的T大小
                $suffix = "TB";               //单位为TB
            }elseif($bytes >= pow(2,30)){           //如果提供的字符数大于等于2的30次方
                $return = round($bytes/pow(1024,3),2);        //将字节大小转换为同等的G大小
                $suffix = "GB";               //单位为GB   
            }elseif($bytes >= pow(2,20)){           //如果提供的字符数大于等于2的20次方
                $return = round($bytes/pow(1024,2),2);        //将字节大小转换为同等的M大小
                $suffix = "MB";               //单位为MB   
            }elseif($bytes >= pow(2,10)){           //如果提供的字符数大于等于2的10次方
                $return = round($bytes/pow(1024,1),2);        //将字节大小转换为同等的K大小
                $suffix = "KB";               //单位为KB   
            }else{
                $return = $bytes;                             //字节大小单位不变
                $suffix = "Byte";
            }
            return $return." ".$suffix;         //返回合适的文件大小和单位
        }
     
        //调用自定义函数,将当前目录下的file.php文件传入,获取属性
        getFilePro("file.php");          
    ?>

    除了可以使用这些独立的函数分别获取文件的属性外,还可以使用一个stat()函数获取文件的大部分属性值。该函数将返回一个数组,数组中的每个元素对应文件的一种属性值。该函数的使用如下代码所示:

    1
    2
    3
    4
    5
    6
    <?php
        //返回关于文件的信息数组,是关联和索引混合的数组
        $filePro = stat("file.php");
        //只打印其中的关联数组,第13个元素之后为关联数组
        print_r(array_slice($filePro,13));
    ?>

    除了使用stat()函数获取文件的大部分属性值之外,也可以使用对应的函数lstat和fstat()函数取得。和stat()函数略有不同,stat()函数作用于一个普通的文件,lstat()只能作用于一个符号连接,而fstat()函数需要一个资源句柄。

     
  • 相关阅读:
    面试官没想到一个Volatile,我都能跟他扯半小时
    面试官:你经历过数据库迁移么?有哪些注意点和难点?
    【逼你学习】让自制力提升300%的时间管理方法、学习方法分享
    面试官:说一下内存溢出排查过程和工具?我...
    大厂需求研发流程,进去前了解一波?
    面试必问:分布式锁实现之zk(Zookeeper)
    Redis之分布式锁实现
    大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
    【面经分享】互联网寒冬,7面阿里,终获Offer,定级P6+
    我找到了Dubbo源码的BUG,同事纷纷说我有点东西
  • 原文地址:https://www.cnblogs.com/ncong/p/3953219.html
Copyright © 2020-2023  润新知