PHP文件系统操作常用函数整理

本文于763天之前发表,文中内容可能已经过时。如有疑问,请在评论区留言。

  前些日子自己搭建了aria2离线下载,用不了太多资源,故分享出来供大家使用了,但是之前只给它分了50G的磁盘空间,一周之内磁盘两次被占满,然后项目异常,于是我便想在任务面板添加一个可以实时显示磁盘剩余空间的功能,当然方法有很多,我选择了php。在此整理一下文件操作相关的php代码。虽然PHP提供很多内置的文件处理函数,但是分得特别细,有一些操作需要多个函数一起使用才能达到目标,比如删除非空文件夹的所有内容,遍历文件夹等功能,本人是PHP菜鸟,一定存在很多bug,如果你愿意,非常欢迎留言,我收到留言后再修改。

/**
 * [以文字形式返回文件的类型]
 * @param  [type] $filename [description]
 * @return [type]           [description]
 */
function getfiletype($filename){
    $type=filetype($filename);
    switch($type){
        case "dir":
            echo "this is a dir<br>";
            break;
        case "file":
            echo "this is a file<br>";
            break;
        case "unknown":
            echo "can't know the file<br>";
            break;
    }
}
/**
 * [返回格式化后的文件大小]
 * @param  [type] $size [description]
 * @return [type]       [description]
 */
function transfer_filesize($size){
    if($size>=pow(2,40)){
        return ceil($size/pow(2,40))."TB";
    } else if($size>=pow(2,30)){
        return ceil($size/pow(2,30))."GB";
    } else if($size>=pow(2,20)){
        return ceil($size/pow(2,20))."MB";
    } else if($size>=pow(2,10)){
        return ceil($size/pow(2,10))."KB";
    } else {
        return $size."B";
    }
}
/**
 * [获取文件夹或者文件的属性,包含文件类型及大小]
 * @param  [type] $filename [description]
 * @return [type]           [description]
 */
function getfilepro($filename){
    if(file_exists($filename)){
        echo "the file is exists<br>";
        getfiletype($filename);
        echo "the file size is ".transfer_filesize(filesize($filename))."<br>";
    } else {
        echo "the file is not exists<br>";
    }
}
/**
 * [遍历整个文件夹]
 * @param  [string] $file [需要遍历的文件夹名或文件名]
 * @return [type]       [description]
 */
function show_all_files($file){
    $dir=opendir($file);
    while($filename=readdir($dir)){
        if($filename!='.' && $filename!='..'){
            $filename=$file."/".$filename;
            if(is_dir($filename)){
                echo "目录".$filename."<br>";
                show_all_files($filename);
            } else{
                echo "文件".$filename."<br>";
            }
        }
    }
    closedir($dir);
}
show_all_files("./class");
/**
 * [获取一个磁盘或者分区的总容量和剩余容量]
 * @param  [string] $disk [description]
 * @return [array]       [可取消注释,返回一个包含两个值的数组]
 */
function get_disk_space($disk){
    $total_space=transfer_filesize(disk_total_space($disk));
    $free_space=transfer_filesize(disk_free_space($disk));
    echo $disk."盘总容量为:".$total_space."<br>";
    echo $disk."盘可用容量为:".$free_space."<br>";
    return array($total_space,$free_space);
}
get_disk_space("C:");
/**
 * [目录总数,文件总数,及目录总大小]
 * @param  [string] $filename [目录名]
 * @return [array]           [返回该目录的目录总数,文件总数,及目录总大小]
 */
function get_all_nums($filename){
    $total_size=0;
    $total_dir_nums=0;
    $total_file_nums=0;
    function get_nums($filename){
        global $total_dir_nums,$total_file_nums,$total_size;
        $dir=opendir($filename);
        while($file=readdir($dir)){
            if($file!="." && $file!=".."){
                $file=$filename."/".$file;
                if(is_dir($file)){
                    get_nums($file);
                    $total_dir_nums++;
                } else {
                    $total_file_nums++;
                    $total_size+=filesize($file);
                }
            }
        }
        closedir($dir);
        return array($total_dir_nums,$total_file_nums,$total_size);
    }
    list($dir,$file,$size)=get_nums($filename);
    echo "文件数为:".$file."<br>";
    echo "目录数为:".$dir."<br>";
    echo "总大小为:".transfer_filesize($size)."<br>";
}
get_all_nums("./class");
/**
 * [删除一个非空的目录或文件]
 * @param  [string] $filename [要删除的目录或文件名]
 * @return [null]           [null]
 */
function delete_dir($filename){
    if(!file_exists($filename)){
        die("不存在该目录");
    }
    if(is_file($filename)){
        unlink($filename);
        echo "成功删除文件".$file."<br>";
    }
    $dir=opendir($filename);
    while($file=readdir($dir)){
        if($file!="." && $file!=".."){
            $file=$filename."/".$file;
            if(is_dir($file)){
                delete_dir($file);
            } else {
                unlink($file);
                echo "成功删除文件".$file."<br>";
            }
        }
    }
    closedir($dir);
    rmdir($filename);
    echo "成功删除目录".$filename."<br>";
}
delete_dir("./aaaa");
/**
 * [用来拷贝一个目录] 
 * @param  [string] $dir_src  [源目录]
 * @param  [string] $dir_dest [目标目录]
 * @return [null]           [description]
 */
function copy_dir($dir_src,$dir_dest){
    if(!file_exists($dir_src)){
        die("源文件不存在<br>");
    }
    if(!file_exists($dir_dest)){
        mkdir($dir_dest);
    }
    $dir=opendir($dir_src);
    while($file=readdir($dir)){
        if($file!="." && $file!=".."){
            $src_file=$dir_src."/".$file;
            $dest_file=$dir_dest."/".$file;
            if(is_dir($src_file)){
                copy_dir($src_file,$dest_file);
            } else {
                copy($src_file,$dest_file);
            }
        }
    }
    closedir($dir);
}
copy_dir("../aaaa","./bbbb");
/**
 * [逐个字符读出文件所有内容]
 * @param  [string] $filename [要读的文件名]
 * @return [null]           [description]
 */
function get_contents_one($filename){
    $fp=fopen($filename,"r");
    while(!feof($fp)){
        echo fgetc($fp);
    }
    echo "<br>";
    fclose($fp);
}
get_contents_one("bbb.txt");
/**
 * [逐行读出文件所有内容]
 * @param  [string] $filename [要读的文件名]
 * @return [null]           [description]
 */
function get_contents_two($filename){
    $fp=fopen($filename,"r");
    while(!feof($fp)){
        echo fgets($fp);
    }
    echo "<br>";
    fclose($fp);
}
get_contents_two("bbb.txt");
黑科技!给openvz主机开启BBR加速!