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

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

文件类型

  PHP是以UNIX的文件系统为模型的,因此在Windows系统中我们只能获得“file”、“dir”或者“unknown”三中文件类型。而在UNIX系统中,我们可以获得“block”、“char”、“dir”、“fifo”、“file”、“link”和“unknown”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将缓存这些函数的返回信息以提供更快的性能。然而在某些情况下,你可能想清楚被缓存的信息。例如,如果在一个脚本中多次检查同一个文件,而该文件在此脚本执行期间有被删除或修改的危险时,你需要清楚文件状态缓存。在这种情况下,可以用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()函数需要一个资源句柄。

 

PHP文件系统概述的更多相关文章

  1. JFS 文件系统概述及布局分析

    JFS 文件系统概述及布局分析 日志文件系统如何缩短系统重启时间 如果发生系统崩溃,JFS 提供了快速文件系统重启.通过使用数据库日志技术,JFS 能在几秒或几分钟之内把文件系统恢复到一致状态,而非日 ...

  2. 自学Linux Shell8.1-linux文件系统概述及操作

    点击返回 自学Linux命令行与Shell脚本之路 8.1-linux文件系统概述及操作 1. linux支持的文件系统 Windows常用的分区格式有三种,分别是FAT16.FAT32.NTFS格式 ...

  3. Linux文件系统概述

    Unix文件是以字节序列组成的信息载体(container),内核不解释文件的内容. Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有系统的结构,所有Linux用户和程序 ...

  4. Linux 虚拟文件系统概述

    转自:http://blog.csdn.net/u011373710/article/details/70198080 文章梗概 本文首先以“尽量不涉及源代码”的方式讨论Linux虚拟文件系统的存在的 ...

  5. Linux文件系统概述二

    VFS-目录项对象(dentry) 每个文件除了有一个索引节点 inode 数据结构外,还有一个目录项 dentry 数据结构 dentry 结构代表的是逻辑意义上的文件,描述的是文件逻辑上的属性,目 ...

  6. GlusterFS分布式文件系统概述

    一.GlusterFS概述 GlusterFS是一个开源的分布式文件系统,同时也是Scale-Out存储解决方案Gluster的核心,在存储数据方面有强大的横向扩展能力,通过扩展不同的节点可以支持PB ...

  7. NTFS文件系统概述

    NTFS简介 NTFS是Windows NT家族1的限制级专用的文件系统2.Win95.Win98识别不了NTFS,只有支持NT内核的OS才能识别NTFS文件系统.当前,NTFS取代了老式的FAT文件 ...

  8. PHP12 文件操作

    学习要点 文件系统概述 目录基本操作 文件基本操作 文件上传下载 文件上传类的设计     文件系统概述 概述 PHP文件系统的操作是基于UNIX系统模型,所以有一些文件处理函数无法在windows服 ...

  9. 分布式文件存储:FastDFS简单使用与原理分析

    引言 FastDFS 属于分布式存储范畴,分布式文件系统 FastDFS 非常适合中小型项目,在我接手维护公司图片服务的时候开始接触到它,本篇文章目的是总结一下 FastDFS 的知识点. 用了 2 ...

随机推荐

  1. 【动态规划】Vijos P1037 搭建双塔

    题目链接: https://vijos.org/p/1037 题目大意: 给n块砖的长度(n<=100),问从中任选m块砖能否建成2个相同高度的塔. 能的话求最高高度,不能输出 Impossib ...

  2. HDOJ(HDU) 2137 circumgyrate the string(此题用Java-AC不过!坑)

    此题如果有用JavaACDSee,请评论,谢谢了. Problem Description Give you a string, just circumgyrate. The number N mea ...

  3. [Locked] One Edit Distance

    One Edit Distance Given two strings S and T, determine if they are both one edit distance apart. 分析: ...

  4. top -bcn -1

    ^[[?1h^[=^[[?25l^[[H^[[2J^[(B^[[mtop #!/bin/bash#echo 性能数据捕捉时间: `date +%Y-%m-%d_%H:%M:%S` \n >> ...

  5. sqlserver使用OpenQuery或OPENROWSET遇到的问题

    OpenQuery,OPENROWSET允许用户在链接服务器上查询.通过这种方法来得到查询的结果集.     1.在创建存储过程中,必须设置           SET   ANSI_NULLS   ...

  6. sql server常用查询

    最近在做一些练习,觉得数据的查询是一个很有意思的,在做的过程中一些好的查询方法也使自己感觉到数据库的强大,于是乎就会想到要把这些方法记下来,以后就懒得再去想了 1.查询是整百的倍数 SELECT 实缴 ...

  7. JVM调优之jstack找出发生死锁的线程

    1.执行死锁程序 2.执行 jstack -l 21733 | more 结果如下: 死锁程序: public static void main(String[] args) { // TODO Au ...

  8. 命令行修复MBR分区

    命令行修复MBR 1.shift+F10打开命令行 2.输入:diskpart 3.输入:list disk 查看磁盘信息 4.选择你要操作的磁盘:select disk 0 5.输入:clean,清 ...

  9. memcache实现公共计数器网站

    在反问题的过程中遇到的最近项目.网上查了很多资料并没有完全实现. 因此,要找到适合自己的xmemcache client和memcache关联API和说明,我们发现了一个比较完美的实现. 键类:net ...

  10. NSDateFormatter 格式说明

    格式化参数如下:    G: 公元时代,例如AD公元    yy: 年的后2位    yyyy: 完整年    MM: 月,显示为1-12    MMM: 月,显示为英文月份简写,如 Jan    M ...