【学习:php文件编程操作】

1、第一种获取文件信息

$file_path = 'd:/file.txt';
// 打开方式
if($fp = fopen($file_path, 'r')){
    // 获取文件信息
    $file_info = fstat($fp);
//    var_dump($file_info);

    // 返回文件相关时间
    date_default_timezone_set('PRC');
    echo '<br>文件创建时间是:' . date('Y-m-d H:i:s', $file_info['ctime']);
    echo '<br>文件修改时间是:' . date('Y-m-d H:i:s', $file_info['mtime']);
    echo '<br>文件访问时间是:' . date('Y-m-d H:i:s', $file_info['atime']);
} else {
    echo '<br>失败';
}

2、第二种获取文件信息

$file_path = 'd:/file.txt';

if(file_exists($file_path)){
    echo '<br>文件类型是:' . filetype($file_path);
    echo '<br>文件大小是:' . filesize($file_path);

    // 返回文件相关时间
    date_default_timezone_set('PRC');
    // touch($file_path) ; 在php中 touch() 会修改访问时间
    echo '<br>文件创建时间是:' . date('Y-m-d H:i:s', filectime($file_path));
    echo '<br>文件修改时间是:' . date('Y-m-d H:i:s', filemtime($file_path));
    echo '<br>文件访问时间是:' . date('Y-m-d H:i:s', fileatime($file_path));

} else {
    echo '<br>文件不存在';
}

3、将文件的内容读取,并显示在网页(3种方式)

3.1 一次性的读取

$file_path = 'd:/file.txt';
// 打开文件
if($fp = fopen($file_path, 'r')){
    // 将文件读取到一个字符串
    $file_size = filesize($file_path);
    // 读取多少字节
    $str = fread($fp, $file_size);
    // 关闭资源
    fclose($fp);

    # 对读取内容进行替换
    $str = str_replace("\r\n", '<br>', $str);
    $str = str_replace("\n", '<br>', $str);
    $str = str_replace("    ", '&nbsp;&nbsp;&nbsp;&nbsp;', $str); // tab替换,注意空格处是tab空格=4个&nbsp;

    echo $str;
} else {
    echo '<br>文件不存在';
}

3.2 分字节读取

$file_path = 'd:/file.txt';
// 打开文件
if($fp = fopen($file_path, 'r')){

    // 设置字节
    $size = 1024;
    $temp = '';// 临时接受读取数据
    $str = ''; // 最终接收的字符串
    // feof() 判断文件是否读到到了结尾
    while(!feof($fp)){
        $temp = fread($fp, $size);
        $str .= $temp;
    }
    // 关闭资源
    fclose($fp);

    # 对读取内容进行替换
    $str = str_replace("\r\n", '<br>', $str);
    $str = str_replace("\n", '<br>', $str);
    $str = str_replace("    ", '&nbsp;&nbsp;&nbsp;&nbsp;', $str); // tab替换,注意空格处是tab空格=4个&nbsp;

    echo $str;
} else {
    echo '<br>文件不存在';
}

3.3 最简单,file_get_contents()

$file_path = 'd:/file.txt';
// 将内容读取字符串
$str = file_get_contents($file_path);
# 对读取内容进行替换
$str = str_replace("\r\n", '<br>', $str);
$str = str_replace("\n", '<br>', $str);
$str = str_replace("    ", '&nbsp;&nbsp;&nbsp;&nbsp;', $str); // tab替换,注意空格处是tab空格=4个&nbsp;
echo $str;

总结
【推荐】使用第三种方式
【处理海量数据】可以考虑使用第二种使用缓存方法来处理

4、读取外部的ini文件

在项目实施过程中,我们有时候会把一些设置信息,写在外部文件,在运行代码时,从外部文件读取这些信息,比如 用户名密码,主机编码等等

#my.ini文件 格式是规定好的 (属性名=属性值)
user=root
pwd=abc
host=localhost

这时使用parse_ini_file 函数就可以直接处理

$file_path = 'd:/file.txt';
$ini_data  = parse_ini_file($file_path);
echo '<br>user = ' . $ini_data['user'];
echo '<br>pwd  = ' . $ini_data['pwd'];
echo '<br>host = ' . $ini_data['host'];

这里注意有一个函数可以一行一行读取 fgets()

5、创建文件,并写入内容

创建一个新文件,写入内容 10句'hello,world'

5.1 fopen()

$file_path = 'd:/file2.txt';
if(!file_exists($file_path)){
    $fp = fopen($file_path, 'w');  // 写入方式打开,清除文件内容,如果文件不存在则尝试创建之
    // 准备写入的数据
    $str = '';
    for ($i=0; $i<10; $i++){
        $str .= "hello,world\r\n";
    }
    // 写入文件
    fwrite($fp, $str);
    fclose($fp);
    echo '<br>文件创建,并写入成功';

} else {
    echo '<br>文件已经存在';
}

注意
如果追加 fopen( $file_path, 'a')// 用 a\

5.2 file_put_contents()

$file_put_contents($file_path, $str); // 文件不存在,先创建再写入;文件存在,直接写入
$file_put_contents($file_path, $str, FILE_APPEND ); // 追加写入

6、文件删除

使用 unlink()

7、文件修改

修改文件名 rename( $old, $new )

# 注意改成中文名时候,需要先将utf-8 转成gbk或者gb2312
# iconv ( string $in_charset, string $out_charset, string $str )
$new = iconv( 'utf-8',  'gbk', $new ); //转码新文件名

rename($old, $new); // 重命名文件名

8、创建目录

判断是否目录 is_dir()
使用 mkdir()

8.1 创建一级目录

# 创建一级目录
$dir_path = 'd:/web';
if(!is_dir($dir_path)){
    if(mkdir($dir_path)){
        echo '<br>创建目录成功';
    } else {
        echo '<br>创建目录失败';
    }

} else{
    echo '<br>该文件已经存在';
}

8.2 创建多级目录

mkdir() 默认只创建一级目录,如果要多级 mkdir($dir_path, 0777, true) 0777表示用户最大权限,window下没意义,linux表示递归创建

# 创建多级目录
$dir_path = 'd:/web/aa/bb/cc';
if(!is_dir($dir_path)){
    if(mkdir($dir_path, 0777, true)){
        echo '<br>创建目录成功';
    } else {
        echo '<br>创建目录失败';
    }

} else{
    echo '<br>该文件已经存在';
}

8.3 删除目录

使用 rmdir()

9、拷贝文件

使用 copy()

# 注意如果有中文名,要用iconv()先转码
copy( $old_paht, $new_path);

10、实例应用

10.1 遍历某个文件夹,判断它们分别是目录还是文件

// 确定对那个文件夹遍历
$dir_path = 'd:/web';
if(is_dir($dir_path)){
    # 打开一个目录句柄
    $dp = opendir($dir_path);
    // 循环读取目录下的文件和目录
    while(false !==  ($fileName = readdir($dp))){
        $fileName = iconv('utf-8', 'gbk', $fileName);
        if(is_dir($dir_path . $fileName)){
            echo '目录:' . $fileName;
        } else {
            echo '文件:' . $fileName;
        }
    }
    // 关闭资源
    closedir($dp);

} else {
    echo '<br>不是目录,无法遍历';
}

10.2 写一个函数统计某个目录所有文件的大小


/**
 * 计算目录所有文件大小
 * @param $dir_path [string] [目录名]
 */
function getDirSize($dir_path){
    // 初始化大小为0
    $dirSize = 0;
    $dp = opendir($dir_path);

    while(false !== ($filename = readdir($dp))){
        // 拼接文件路径
        $file = $dir_path .'/'. $filename;

        // 不是 .表示当前目录, ..表示上级目录
        if($filename != '.' && $filename != '..'){
            // 判断是子目录还是文件
            if(is_dir($file)){
                // 目录
                $dirSize += getDirSize($file);//递归统计
            } else {
                // 文件
                $dirSize += filesize($file);
            }
        }
    }

    closedir($dp);
    return $dirSize;
}

10.3 删除某个目录(该目录下有文件和文件夹)

// 限制页面执行时间
set_time_limit(100);

/**
 * 删除目录下文件和文件夹
 * @param $dir_path [string] [文件目录]
 */
function removeDir($dir_path){
    $dp = opendir($dir_path);
    while(false !== ($filename = readdir($dp))){
        // 拼接文件名
        $file = $dir_path .'/'. $filename;

        if($filename !='.' && $filename !='..'){
            if(is_dir($file)){
                // 文件夹
                removeDir($file); // 递归删除
            } else {
                // 文件
                unlink($file);
            }
        }
    }

}

10.4 把某个目录的所有文件(包括子目录和其文件)拷贝到其它目录下

// 返回跟操作系统相关的路径分隔符的php内置命令,在windows上返回\,而在linux或者类unix上返回/
define('DS', DIRECTORY_SEPARATOR);

# $old = 'd:/web'; //准备拷贝的路径
# $new = 'e:/www'; //新路径

function copyDir($old, $new){
    if(is_dir($old)){

        @mkdir( $new, 0777, true); // 创建新路径
        $dir_arr = scandir($old); // scandir() 返回指定目录中的文件和目录的数组

        // sizeof() 返回数组中元素的数目
        if( sizeof($dir_arr) > 0){
            foreach ($dir_arr as $file){
                # 注意是 .和 .. 不copy
                if($file =='.' || $file == '..')
                    continue;
                // go on
                if(is_dir($old . DS . $file))
                {
                    copyDir($old . DS . $file, $new . DS . $file); // 递归copy
                }
                else
                {
                    copy($old . DS . $file, $new . DS . $file); // copy文件
                }
            }
        }
        sleep(5);
        return true;

    } else {
        return false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值