php基础知识--文件操作

文件操作

文件

广义角度: 任何一个在磁盘上可以看到的符号(包含真正的文件及文件夹)

狭义角度: 真实存储数据的载体(不包含文件夹, 如doc文件,txt文件等)

 

文件操作: 对文件的增删改查

 

文件分成两类: 文件夹(路径)和文件(普通文件)操作

 

路径操作

对路径(文件夹)进行增删改查(CRUD)

C: create 新增

R: read/retrive 读取

U: update 更新

D: delete 删除

 

在计算机中: 操作仅有两类: 读和写(增删改)

 

读取路径

 

文件(路径)对于PHP来说,都属于外部数据: PHP以资源形式进行操作.

 

 

  1. 获取路径资源:resource  opendir(路径);     //路径可以是相对路径和绝对路径
  2. //路径操作: 读取
        header('Content-type:text/html;charset=utf-8');
    
        //获取路径资源
        $dir = '../';        //本质就是: D:/server/apache/htdocs
    
        $o = opendir($dir);    //如果路径无效: 返回的false
        //var_dump($o);
  3. 获取资源中的数据: string readdir(路径资源): 资源操作是指针操作, 读取一个之后就会下移,如果读到最后,返回false
    //获取路径资源
        $dir = '../';        //本质就是: D:/server/apache/htdocs
    
        $o = opendir($dir);    //如果路径无效: 返回的false
        //var_dump($o);
    
        //读取资源(取得其中包含的文件名)
        echo '<pre>';
        var_dump(readdir($o));
        var_dump(readdir($o));
        var_dump(readdir($o));
  4. 遍历读取整个文件夹: readdir + 循环
    //遍历文件夹
        while($file = readdir($o)){
            //输出
            echo $file,'<br/>';    
  5. 若想重复使用资源,需要重置指针: rewinddir(路径资源)
    //查看当前指针
            var_dump(readdir($o));
        //重置指针
        rewinddir($o);
            //查看重置后效果
        var_dump(readdir($o));        
  6. 关闭资源: closedir(路径资源)
    //关闭资源-释放内存
    closedir($o);

    7,完整代码

    <?php
    
        //路径操作: 读取
        header('Content-type:text/html;charset=utf-8');
    
        //获取路径资源
        $dir = '../';        //本质就是: D:/server/apache/htdocs
    
        $o = opendir($dir);    //如果路径无效: 返回的false
        //var_dump($o);
    
        //读取资源(取得其中包含的文件名)
        echo '<pre>';
        //var_dump(readdir($o));
        //var_dump(readdir($o));
        //var_dump(readdir($o));
    
        //遍历文件夹
        while($file = readdir($o)){
            //输出
            echo $file,'<br/>';    //文件从目录中读取出来(操作系统是中文系统:GBK)
            //转码函数: iconv('原数据GBK','目标字符集UTF-8','转换内容');
            //echo iconv('GBK','UTF-8',$file),'<br/>';
            //iconv是一个转义字符编码的函数
        }
    
        //var_dump(readdir($o));
        //重置指针
        //rewinddir($o);
        //var_dump(readdir($o));
    
        //关闭资源
        closedir($o);

    路径相关函数

    file_exists: 判断一个文件是否存在(广义文件: 包括路径和文件)

    //路径操作相关函数:(包含增删改)
    
        //定义路径
        $dir1 = '../';                //有效路径(相对路径)
        $dir2 = 'D:/server';        //绝对路径
        $dir3 = 'test';                //当前目录下的test目录: 20150924/test/
        $file1 = 'demo01_dir_read.php';    //有效文件
        $file2 = 'test.txt';            //无效文件(当前目录不存在)
            echo '<pre/>';
            //判断文件有效性(广义)
        var_dump(file_exists($dir1));        //true
        var_dump(file_exists($dir2));        //true
        var_dump(file_exists($dir3));        //false: 没有
        var_dump(file_exists($file1));        //true
        var_dump(file_exists($file2));        //false: 不存在

    is_dir: 判断路径是否有效

    //路径操作相关函数:(包含增删改)
    
        //定义路径
        $dir1 = '../';                //有效路径(相对路径)
        $dir2 = 'D:/server';        //绝对路径
        $dir3 = 'test';                //当前目录下的test目录: 20150924/test/
        $file1 = 'demo01_dir_read.php';    //有效文件
        $file2 = 'test.txt';            //无效文件(当前目录不存在)
    
    
        //判断
        echo '<pre>';    
            //路径判断
        var_dump(is_dir($dir1));        //true
        var_dump(is_dir($dir2));        //true
        var_dump(is_dir($dir3));        //false: 不存在
        var_dump(is_dir($file1));        //false: 不是路径是文件        

    is_file: 判断文件是否有效

    Mkdir: mk: make,创建路径(文件夹)

            //加@符号防止已经创建再次创建出现错误
        //创建目录
        //var_dump(@mkdir('test'));    

    Rmdir: remove, 删除路径

    //删除目录
        var_dump(@rmdir('test'));

    文件夹读取

    有一个函数: 已经将遍历读取文件夹这件事进行了封装: array scandir(有效路径), 返回一个数组,数组中包含所有当前路径下的文件名.

        //定义路径
        $dir = '../';
    
        //获取路径下的所有文件名
        $files = scandir($dir);
        //var_dump($files);

    如果遍历出来的结果是一个文件夹: 那么用蓝色输出,如果是文件,使用红色输出.

        //遍历输出
        foreach($files as $file){
            //判断: 文件夹蓝色,文件红色
            //如果要判断一个文件是否有效: 一定要指定路径
    
            if(is_dir($dir . '/' . $file)){    //$file只是一个文件名(字符串)
                //路径
            echo '<font color="blue">',$inner,'</font><br/>';
                    }else{
                        //文件
                        echo '<font color="red">',$inner,'</font><br/>';
                    }    

    如果当前从文件夹中读出来的内容依然是一个文件夹: 说明内部还有文件需要遍历: 继续用scandir读取里面的内容,然后再遍历输出.

    echo '<font color="blue">',$file,'</font><br/>';
    
                //.和..是"无效路径": 无效子文件夹,要排除
                if($file == '.' || $file == '..') continue;
    
                //路径下依然有文件: 再次读取
                $innerfiles = scandir($dir . '/' . $file);
    
                //再次遍历
                foreach($innerfiles as $inner){
                    //缩进
                    echo str_repeat("&nbsp;",4);
    
                    //判断: 路径蓝色,文件红色
                    if(is_dir($dir . '/' . $file . '/' . $inner)){
                        //路径
                        echo '<font color="blue">',$inner,'</font><br/>';
                    }else{
                        //文件
                        echo '<font color="red">',$inner,'</font><br/>';
                    }
                }
            }else{
                //文件
                echo '<font color="red">',$file,'</font><br/>';
            }
        }

    遍历当前目录下的文件夹如果是空文件夹则蓝色,是文件则红色

    <?php
    
        //利用函数scandir遍历路径
    
        //定义路径
        $dir = '../';
    
        //获取路径下的所有文件名
        $files = scandir($dir);
        //var_dump($files);
    
        //遍历输出
        foreach($files as $file){
            //判断: 文件夹蓝色,文件红色
            //如果要判断一个文件是否有效: 一定要指定路径
    
            if(is_dir($dir . '/' . $file)){    //$file只是一个文件名(字符串)
                //路径
                echo '<font color="blue">',$file,'</font><br/>';
    
                //.和..是"无效路径": 无效子文件夹,要排除
                if($file == '.' || $file == '..') continue;
    
                //路径下依然有文件: 再次读取
                $innerfiles = scandir($dir . '/' . $file);
    
                //再次遍历
                foreach($innerfiles as $inner){
                    //缩进
                    echo str_repeat("&nbsp;",4);
    
                    //判断: 路径蓝色,文件红色
                    if(is_dir($dir . '/' . $file . '/' . $inner)){
                        //路径
                        echo '<font color="blue">',$inner,'</font><br/>';
                    }else{
                        //文件
                        echo '<font color="red">',$inner,'</font><br/>';
                    }
                }
            }else{
                //文件
                echo '<font color="red">',$file,'</font><br/>';
            }
        }

    文件操作

    针对狭义文件的增删改查.

     

    PHP中文件操作分为两种: “高级版”操作和”低级版”操作.

     

    高级版操作: PHP5操作, PHP5以后, PHP重新封装了一组函数用来操作文件

    File_get_contents,file_put_contents,file: 都不涉及资源操作

     

    低级版操作: PHP5以前的操作, 以资源形式进行操作.

     

    “高级版”操作

     

    文件读取操作

     

    PHP高级操作中: 封装一个函数,可以直接从文件中读取所有内容

    String File_get_contents(‘文件路径’);

        //PHP5文件读取操作
        header('Content-type:text/html;charset=utf-8');
    
        //给定文件路径
        $file = 'demo01_dir_read.php';
    
        //读取其中内容
        $str = file_get_contents($file);
        //var_dump($str);
    
        //file读取文件
        $arr = file($file);
        var_dump($arr);

    文件写操作

     

    在PHP高级版中: PHP提供了一个函数,可以将要写入的数据直接写入到文件: int file_put_contents(目标文件,要写入的内容[,写入方式]);    //该函数可以自动创建一个不存在的文件.

        //PHP5文件写操作
    
        //准备要写入文件的内容
        $info = 'hello world';
    
        //写入文件
        $res = file_put_contents('hey.txt',$info);
        //var_dump($res);

    PHP中: file_put_contents默认的永远是覆盖数据,若想追加数据,需要通过第三个参数控制(写入方式)

    FILE_USE_INCLUDE_PATH : 值为1, 也是覆盖

    FILE_APPEND: 值为8, 代表追加

    //PHP5文件写操作
    
        //准备要写入文件的内容
        $info = 'hello world';
    
        //写入文件
        $res = file_put_contents('hey.txt',$info);
        //var_dump($res);
    
        //echo FILE_APPEND;
    
        //追加文件写入
        file_put_contents('hey.txt','你好世界',FILE_APPEND);

    “低级版”操作

    低级版操作: PHP5以前对文件的操作方式: 采用资源形式进行操作.

    不论读写,都是资源操作.

     

     

    读操作

     

    1. 打开文件资源: resource fopen(文件路径,’操作模式’): 在一开始打开资源的时候,就必须指定打开是为了干什么: 读还是写

    操作模式: 采用什么样的方式对数据进行操作: 读,写或者读写

  7. 读取模式打开数据(r)

    //低版本文件读操作
        header('Content-type:text/html;charset=utf-8');
    
    
        //打开文件资源: r模式打开(只读)
        $f = fopen('hey.txt','r');
        //var_dump($f);
    
        echo '<pre>';
    1. 读取数据: 所有的读取操作都是指针操作, 读完之后指针会下移到指定位置

    Fgetc: c代表character, 一次读取一个字节

    //读取数据
        //按字节读取
        //var_dump(fgetc($f));

    Fgets: s代表string, 一次读取指定长度的字符串或者一行(最多一行)

    //按行读取
        //var_dump(fgets($f,5));
        //var_dump(fgets($f,1024));

    Fread: 获取指定长度的字符串

    //读取指定长度
        var_dump(fread($f,1024));
  8. 关闭资源: fclose(打开资源)
    //关闭资源
        fclose($f);

    写操作

  9. 使用读写方式打开资源: w+
    //PHP低版本文件写操作:读写
    
        //打开资源: w+
        $f = fopen('hey.txt','w+');
        //var_dump($f);
  10. 写操作: fputs/fwrite(资源,要写的数据);
    //写入内容
        $res = fputs($f,'hello world');
        //var_dump($res);
  11. 读取数据
  12. 当前模式是读写模式: 一上来就清空了所有数据, 然后重写: 写一个指针下移一个: 当写完之后指针在文件的最末尾: 永远读到false: 需要充值指针: fseek(资源,指针位置);

    //重置指针
        fseek($f,2);
    
        //读取数据
        var_dump(fgets($f,1024));
  13. 关闭资源
        //关闭资源
        fclose($f);

    文件操作相关函数

    Copy: 复制

        //文件复制
        copy('hey.txt','hello.txt');    //默认都在当前目录操作

    删除文件

    //删除文件
        @unlink('hey.xls');
        //重命名
        rename('hello.txt','hello.xls');    //如果文件不存在会报错

    Rename可以指定新名字文件所在的路径: 可以实现文件的移动: 剪切

     

    Filemtime: m代表modify, 文件最后修改时间

    //获取文件修改时间
        var_dump(date('Y-m-d H:i:s',filemtime('demo01_dir_read.php')));    //时间戳

    Filesize: 文件大小

        //获取文件大小
        var_dump(filesize('hey.txt'));

    Fileperms: perms: permission权限的意思, 获取文件的权限(linux): linux下的权限是分为三组: 创建者, 所属组,其他用户, 每种用户都有三种权限: 读1, 写1, 执行0 => 6: 默认是8进制数据

        //获取文件权限
        echo fileperms('demo01_dir_read.php');
        printf('%o',fileperms('demo01_dir_read.php'));

    代码

    <?php
    
        //文件操作相关函数
    
        echo '<pre>';
    
        //获取文件权限
        echo fileperms('demo01_dir_read.php');
        printf('%o',fileperms('demo01_dir_read.php'));
    
        //获取文件修改时间
        var_dump(date('Y-m-d H:i:s',filemtime('demo01_dir_read.php')));    //时间戳
    
        //获取文件大小
        var_dump(filesize('hey.txt'));
    
        //文件复制
        copy('hey.txt','hello.txt');    //默认都在当前目录操作
    
        //删除文件
        @unlink('hey.xls');
    
        //重命名
        rename('hello.txt','hello.xls');    //如果文件不存在会报错
        //move_uploaded_file('hello.xls','hey.xls');    //只能操作上传文件
    
        

    文件下载

    文件下载: 从服务器将文件获取到本机电脑的过程.

    下载的本质: 服务器将文件读取到内存 -> 通过内存将数据打包发送给浏览器 -> 浏览器接收数据整理成文件.

     

    实现文件下载有两种方式: a标签下载和PHP下载

     

    A标签下载

     

    刚好浏览器碰到了一个不能识别的文件: 浏览器解析不了, 保存

        <a href="hey.txt">点我下载</a>
        <a href="demo10_php_download.php">点我PHP下载</a>

     

    缺点

    1. 对文件格式有要求: 浏览器不可识别的文件
    2. 不安全: 会严格暴露文件的位置,文件的真实路径,名字等
    3. PHP下载

       PHP要实现下载需要解决一个问题: 浏览器不要解析

      Header(‘Content-type:application/octet-stream’); //header之前不要输出内容

          header('Content-type:application/octet-stream');    //二进制流浏览器不能解析

      PHP下载

       

      PHP要实现下载需要解决一个问题: 浏览器不要解析

      Header(‘Content-type:application/octet-stream’); //header之前不要输出内容

      //PHP实现文件下载
          header('Content-type:text/html;charset=utf-8');
      
          //告诉浏览器不要解析内容
          header('Content-type:application/octet-stream');    //二进制流浏览器不能解析

      将文件读取内存,输出给浏览器: echo

      //读取文件输出给浏览器
          echo file_get_contents('hey.txt');

       

      解决文件名字问题: 服务器要告诉浏览器,建议用什么名字保存文件.

      Header(‘Content-disposition:attachment;filename=建议的名字’);

      //建议浏览器对文件进行命名处理
          header('Content-disposition:attachment;filename=美女.jpg');

       

      优点

      1. 任何文件都可以实现下载(浏览器不允许解析)
      2. 任何文件都不会暴露真实内容,真实路径,真实名字
        <?php
        
            //PHP实现文件下载
            header('Content-type:text/html;charset=utf-8');
        
            //告诉浏览器不要解析内容
            header('Content-type:application/octet-stream');    //二进制流浏览器不能解析
        
            //建议浏览器对文件进行命名处理
            header('Content-disposition:attachment;filename=美女.jpg');
        
            //读取文件输出给浏览器
            echo file_get_contents('hey.txt');

         

转载于:https://www.cnblogs.com/IT-Computer-TcpIp/p/4954964.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值