前端学PHP之文件操作

Posted 不动如山岳 难如知阴阳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端学PHP之文件操作相关的知识,希望对你有一定的参考价值。

 

前面的话

  在程序运行时,程序本身和数据一般都存在内存中,当程序运行结束后,存放在内存中的数据被释放。如果需要长期保存程序运行所需的原始数据,或程序运行产生的结果,就需要把数据存储在文件或数据库。一般地,小型数据存储在文件中,海量数据存储在数据库中。本文主要介绍php中目录和文件的基本操作

 

文件类型

  文件一般指存储在外部介质上具有名字(文件名)的一组相关数据集合。用文件可长期保存数据,并实现数据共享

  PHP是以UNIX的文件系统为模型的。因此在Windows系统中我们只能获得”file”、”dir”或者“unknown”三种文件类型。而在UNIX系统中,我们可以获得block、char、dir、fifo、file、link和unknown七种类型

  可以使用函数filetype()获取文件的具体类型,可能的值有fifo,char,dir,block,link,file 和 unknown

string filetype ( string filename ) 

  如果出错则返回 FALSE。如果调用失败或者文件类型未知的话 filetype() 还会产生一个 E_NOTICE 消息

  在服务器中新建一个目录test,并在目录中新建一个文件a.txt

<?php
echo filetype(\'test/a.txt\');  // file
echo filetype(\'test/\');        // dir
echo filetype(\'test/b.txt\');  // Warning: filetype(): Lstat failed for test/b.txt
?>

  在这7种文件类型中,window系统常用的是\'file\'和\'dir\'这两种,它们配套的类型检测函数分别是is_dir( )和is_file( )

is_dir( )

  判断给定文件名是否是一个目录。如果文件名存在并且是一个目录则返回 true,否则返回 false 

bool is_dir(_name)

is_file( )

  判断给定文件名是否为一个正常的文件,如果文件存在且为正常的文件则返回 true 

bool is_file(_name)    
<?php
var_dump (is_file(\'test/a.txt\'));  //boolean true
var_dump (is_dir(\'test/\'));        //boolean true
?>

 

文件属性

  一般地,在文件或目录右键菜单中,选择属性,即可查看文件的属性

  下表中列出了php中关于文件属性的常用函数

复制代码
<?php
var_dump (file_exists(\'test/a.txt\'));  //boolean true
var_dump (filesize(\'test/a.txt\'));  // int 0 
var_dump (is_readable(\'test/a.txt\'));  //boolean true
var_dump (is_writeable(\'test/a.txt\'));  //boolean true
var_dump (is_executable(\'test/a.txt\'));  //boolean false
var_dump (date("Y-m-d H:i:s",(filectime(\'test/a.txt\'))));//string \'2016-11-22 06:47:54\' (length=19)
var_dump (date("Y-m-d H:i:s",(filemtime(\'test/a.txt\'))));//string \'2016-11-22 06:47:54\' (length=19)
var_dump (date("Y-m-d H:i:s",(fileatime(\'test/a.txt\'))));//string \'2016-11-22 06:47:54\' (length=19)
?>
复制代码

 

目录路径

  windows下的目录路径使用是正斜杠(\\),而unix下的目录路径使用是反斜杠(/)

复制代码
$unixPath="/var/www/html/index.php";    
    //在UNIX系统中的绝对路径,必须使用"/"分隔
$winPath="C:\\\\Appserv\\\\www\\\\index.php"; 
    //在Windows系统的绝对路径,默认使用"\\"分隔
$winPath2="C:/Appserv/www/index.php";   
    //在Windows系统中也可使用“/”分隔
复制代码

  因为在Windows系统中也可使用(/)分隔。所以,在PHP中,不论是什么操作系统,全部都使用反斜杠(/)代表路径分隔符号 

  在PHP中,还提供了一个常量DIRECTORY_SEPARATOR,以此来代表目录分隔符,但写起来较麻烦

<?php
echo "c:".DIRECTORY_SEPARATOR."a".DIRECTORY_SEPARATOR."b".DIRECTORY_SEPARATOR."c"; //c:\\a\\b\\c
?>

  在windows下多个路径的分隔符使用分号(;)分隔,而unix下使用冒号(:)分隔

  在PHP中,提供了一个常量PATH_SEPARATOR,用来在跨平台的情况下,表示多个路径之间的分隔符

<?php
echo "aaa/ccc/ddd".PATH_SEPARATOR."/www/yyyy";//aaa/ccc/ddd;/www/yyyy
?>

换行 

  在window下,换行是\\r\\n,而在unix下,换行是\\n。通常在写程序中,换行就以unix为准,写作\\n

  同样地,PHP提供了一个常量PHP_EOL,用来在跨平台的情况下,表示换行

.和..

  在PHP中,.表示当前目录,..表示上一级目录

<?php
var_dump (file_exists(\'test/a.txt\'));//boolean true
var_dump (file_exists(\'./test/a.txt\'));//boolean true
var_dump (file_exists(\'../www/test/a.txt\'));//boolean true
?>

根路径

  有两种根路径需要进行区分,一种是客户端根路径,一种是服务器根路径

  以我自己在d盘安装的wamp为例,客户端根路径指\'d:\\wamp\\www\\\',而服务器根路径为为\'d:\\\'

<?php
echo \'<img src="/a.jpg">\';//客户端根路径,相当于d:\\wamp\\www\\a.jpg
mkdir(\'/hello\');//服务器根路径,相当于d:\\hello
?>

路径解析函数

【basename()】

  basename()函数用于返回路径中的文件名部分

复制代码
<?php
echo "1) ".basename("/etc/sudoers.d", ".d");//1) sudoers
echo "2) ".basename("/etc/passwd").PHP_EOL;//2) passwd
echo "3) ".basename("/etc/").PHP_EOL;//3) etc
echo "4) ".basename(".").PHP_EOL;//4) .
echo "5) ".basename("/");//5) 
?>
复制代码

【dirname()】

  dirname()函数用于返回路径中的目录部分

<?php
echo "1) " . dirname("/etc/passwd") . PHP_EOL; // 1) /etc
echo "2) " . dirname("/etc/") . PHP_EOL; // 2) \\
echo "3) " . dirname("."); // 3) .
?>

【pathinfo()】

  pathinfo()函数用于返回文件路径的信息

复制代码
<?php
$path_parts = pathinfo(\'/www/htdocs/inc/lib.inc.php\');
echo $path_parts[\'dirname\'], "\\n";// \'/www/htdocs/inc\' 目录名
echo $path_parts[\'basename\'], "\\n";// \'lib.inc.php\' 文件名
echo $path_parts[\'extension\'], "\\n";// \'php\' 文件后缀
echo $path_parts[\'filename\'], "\\n"; // \'lib.inc\' 文件名不带后缀
?>
复制代码

【realpath()】

  realpath()函数用于返回规范化的绝对路径名

  在Windows上,realpath()会将unix风格的路径改成Windows风格的

<?php
echo realpath(\'/wamp\');// \'D:\\wamp\'
?>

 

目录遍历

glob()

  glob()函数用于寻找与模式匹配的文件路径

array glob ( string $pattern [, int $flags = 0 ] )

  在www目录下新建a.txt和b.txt文件

复制代码
<?php
foreach (glob("*.txt") as $filename) {
    //a.txt size 1050 b.txt size 73
    echo "$filename size " . filesize($filename) . "\\n";
}
?>
复制代码

opendir()

  opendir()函数用于打开目录句柄。如果成功则返回目录句柄的resource,失败则返回 FALSE

resource opendir ( string $path [, resource $context ] )
<?php
var_dump(opendir(\'test\'))//resource(3, stream)
?>

closedir()

  closedir()函数用于关闭目录句柄

void closedir ([ resource $dir_handle ] )

  参数dir_handle表示目录句柄的 resource,之前由 opendir()所打开的。如果目录句柄没有指定,那么会假定为是opendir()所打开的最后一个句柄

<?php
$dir = opendir(\'test\');
closedir($dir);
?>

readdir()

  readdir()函数用于从目录句柄中读取条目,返回目录中下一个文件的文件名。文件名以在文件系统中的排序返回,失败时返回 FALSE

string readdir ([ resource $dir_handle ] )

  在www目录下新建目录test,并在目录test下新建a.txt和b.txt文件

复制代码
<?php
$dir = opendir(\'test\');
echo readdir($dir)."<br>";//.
echo readdir($dir)."<br>";//..
echo readdir($dir)."<br>";//a.txt
echo readdir($dir)."<br>";//b.txt
echo readdir($dir)."<br>";//
closedir($dir);
?>
复制代码

  在遍历目录时,每个目录的前两个返回值都是.和..,.代表当前目录,..代表上一级目录

  所以,一般地,列出当前目录的所有文件并去掉 . 和 ..,常采用下面的代码

复制代码
<?php
if ($handle = opendir(\'test\')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            echo "$file\\n";
        }
    }
    closedir($handle);
}
?>
复制代码

  接下来,在test目录下,新建一个目录in,并在in目录中新建文件c.txt。然后,目录和文件区分显示

  [注意]通过is_dir()函数判断目录时,需要加入路径

复制代码
<?php
if ($handle = opendir(\'test\')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            $file = "test/".$file;
            if(is_dir($file)){
                echo "目录:".$file."<br>";
            }else{
                echo "文件:".$file."<br>";
            }
        }
    }
    closedir($handle);
}
/*
文件:test/a.txt
文件:test/b.txt
目录:test/in
 */
?>    
复制代码

rewinddir()

  rewinddir()函数用于倒回目录句柄,将参数dir_handle指定的目录流重置到目录的开头

void rewinddir ( resource $dir_handle )

  如果不使用rewinddir()函数,则文件只能遍历一次

复制代码
<?php
if ($handle = opendir(\'test\')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            $file = "test/".$file;
            if(is_dir($file)){
                echo "目录:".$file."<br>";
            }else{
                echo "文件:".$file."<br>";
            }
        }
    }
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            $file = "test/".$file;
            if(is_dir($file)){
                echo "目录:".$file."<br>";
            }else{
                echo "文件:".$file."<br>";
            }
        }
    }
    closedir($handle);
}

/*
文件:test/a.txt
文件:test/b.txt
目录:test/in
 */
?>
复制代码

  使用rewinddir()函数,可以把目录句柄返回到第一个文件,从而实现重新遍历

复制代码
<?php
if ($handle = opendir(\'test\')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            $file = "test/".$file;
            if(is_dir($file)){
                echo "目录:".$file."<br>";
            }else{
                echo "文件:".$file."<br>";
            }
        }
    }
    rewinddir($handle);
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            $file = "test/".$file;
            if(is_dir($file)){
                echo "目录:".$file."<br>";
            }else{
                echo "文件:".$file."<br>";
            }
        }
    }
    closedir($handle);
}

/*
文件:test/a.txt
文件:test/b.txt
目录:test/in
文件:test/a.txt
文件:test/b.txt
目录:test/in
 */
?>
复制代码

 

目录统计

disk_total_space()

  disk_total_space()函数返回一个目录的磁盘总大小

float disk_total_space ( string $directory )
复制代码
<?php
$ds = disk_total_space("C:");
echo $ds."<br>";//126652637184
$ds = disk_total_space("D:");
echo $ds;//1000202240000
?>
复制代码

disk_free_space()

  disk_free_space()函数返回目录中的可用空间

float disk_free_space ( string $directory )
复制代码
<?php
$ds = disk_free_space("C:");
echo $ds."<br>";//86087041024
$ds = disk_free_space("D:");
echo $ds;//481647472640
?>
复制代码

  下面来统计在www文件夹下新建的test目录的个数

复制代码
<?php
    $dirn = 0; //目录数
    $filen = 0; //文件数
    //统计一个目录下的文件和目录的个数
    function getdirnum($file) {
        global $dirn;
        global $filen;    
        $dir = opendir($file);
        while (false !== ($filename = readdir($dir))) {
            if($filename!="." && $filename !="..") {
                $filename = $file."/".$filename; //更新路径
                if(is_dir($filename)) {
                    $dirn++;
                    getdirnum($filename);  //递归,就可以查看所有子目录
                } else {
                    $filen++; 
                }
            }
        }
        closedir($dir);
    }
    getdirnum("test");
    echo "目录数为:{$dirn}<br>";//目录数为:1
    echo "文件数为:{$filen}<br>";//文件数为:3
?>
复制代码

  下面来统计在www文件夹下新建的test目录的大小

复制代码
<?php
    //统计目录大小
    function dirsize($file) {
        $size = 0;
        $dir = opendir($file);
        while(false !== ($filename = readdir($dir))) {
            if($filename!="." && $filename !="..") {
                $filename = $file."/".$filename;
                if(is_dir($filename)) {
                    $size += dirsize($filename);//使用递归
                } else {
                    $size += filesize($filename);
                }
            }
        }
        closedir($dir);
        return $size;
    }
echo "test目录大小为:".dirsize("test")."<br>";//test目录大小为:302
?>
复制代码
 

目录增删

mkdir()

  mkdir()函数用于新建目录 

bool mkdir ( string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context ]]] )

rmdir()

  rmdir()函数用于删除目录

bool rmdir ( string $dirname [, resource $context ] )

  [注意]该目录必须是空的,而且要有相应的权限。失败时会产生一个 E_WARNING 级别的错误

unlink()

  unlink()函数用于删除文件

bool unlink ( string $filename [, resource $context ] )

  下面来清空test目录

复制代码
<?php
    function deldir($dirname) {
        //如果是文件,直接删除即可
        if(is_file($dirname)) {
            unlink($dirname);
        }
        $dir = opendir($dirname);
        while(FALSE !== ($filename = readdir($dir))) {
            if($filename !="." && $filename!="..") {
                $filename = $dirname."/".$filename;
                if(is_dir($filename)) {
                    deldir($filename);//递归
                }else {
                    unlink($filename);//删除文件
                }
            }
        }
        closedir($dir);
        if($dirname != \'test\'){
            rmdir($dirname);//删除目录
        }
    }
    deldir("test");
?>
复制代码

 

目录复制

copy()

  copy()函数用于拷贝文件 

bool copy ( string $source , string $dest [, resource $context ] )

  [注意]copy()函数不能用于复制目录

<?php
$file = \'a.txt\';
$newfile = \'a.bak\';
copy($file, $newfile);
?>

rename()

  rename()函数用于重命名一个文件或目录

bool rename ( string $oldname , string $newname [, resource $context ] )

  [注意]rename()函数具有移动文件或目录的功能 

  下面把www目录下的test目录剪贴,命名为t,并移动到d盘目录下

<?php
rename("test", "d:/t");
?>

  使用rename()只能实现剪切的操作,使用copy()只能复制文件。如果要复制目录,则需要使用循环和遍历

复制代码
<?php
    /**
     * $dirsrc  原目录
     * $dirto  目标目录
     */
    function copydir($dirsrc, $dirto) {
        //如果目录不存在,则新建一个目录
        if(!file_exists($dirto)) {
            mkdir($dirto);
        }
        $dir = opendir($dirsrc);
        while(FALSE !== ($filename = readdir($dir))) {
            if($filename != "." && $filename !="..") {
                $srcfile = $dirsrc."/".$filename;  //原文件
                $tofile = $dirto."/".$filename;    //目标文件
                if(is_dir($srcfile)) {
                    copydir($srcfile, $tofile);  //递归处理所有子目录
                }else{
                    copy($srcfile, $tofile);//复制文件
                }
            }
        }
    }
    copydir("test", "d:/t");
?>
复制代码

 

文件操作

touch()

  touch()函数用来设定文件的访问和修改时间。如果文件不存在,则会被创建。成功时返回 TRUE, 或者在失败时返回 FALSE

bool touch ( string $filename [, int $time = time() [, int $atime ]] )

  参数filename表示要设定的文件名,time表示要设定的时间。如果没有提供参数 time 则会使用当前系统的时间;atime表示如果给出了这个参数,则给定文件的访问时间会被设为atime,否则会设置为time。如果没有给出这两个参数,则使用当前系统时间

<?php
    touch(\'abc.txt\')
?>

copy()

  copy()函数用于拷贝文件

bool copy ( string $source , string $dest [, resource $context ] )

  [注意]copy()函数不能用于复制目录

<?php
以上是关于前端学PHP之文件操作的主要内容,如果未能解决你的问题,请参考以下文章

前端学PHP之文件操作

前端学PHP之文件操作

前端学PHP之文件操作

前端学PHP之文件操作(认真读读)

前端学PHP之文件操作(认真读读)

前端学PHP之数组函数