美文网首页
PHP -- 文件操作1

PHP -- 文件操作1

作者: 潘肚饿兵哥哥 | 来源:发表于2019-08-05 23:23 被阅读0次
    
        文件操作:增删改查
        就是:读取、写入、删除这三个操作
        
        ./当前目录
        ../上一层目录
        ../../上两层目录
        相对路径(用的多)
        绝对路径
        
        
        步骤:
            1.打开文件: 
            fopen(filename,mode);   返回值是一个资源
            mode取值(常用的是这6种):
                r(以只读方式打开,文件不存在则尝试创建文件 指针指向文件头)   
                r+(读写方式打开,文件不存在则尝试创建之 指针指向文件头)
                    用 r 或 r+ 文件必须存在,否则会报错
                 
                w(写入方式打开,文件不存在则尝试创建之 指针指向文件头并删除文件内容) 
                w+(读写方式打开,文件不存在则尝试创建之 指针指向文件头并删除文件内容)
                    w会删除文件内容,删除后是不可恢复的,重要文件不能用w写入内容
                    w就是删掉之前的内容,并且写入新的内容
                
                a(写入方式打开,追加,文件不存在则尝试创建之 将文件指针指向文件末尾) 
                a+(读写方式打开,读写,文件不存在则尝试创建之 将文件指针指向文件末尾)
                
            2.进行读写操作
            3.关闭文件
            
            读取:
                $str = fread(handle, length);读取文件,返回值类型是字符串  第一个参数是资源,第二个参数是读多长
                fgets($fp);是读取一行,第二个参数是读多长,如果读取的内容带有标签,标签会被解析出来,渲染出标签效果
                fgetss($fp);也是读取一行,但是会过滤掉标签,标签不会被渲染,也不会显示在浏览器中
                fgetss($fp, 512, '<h1>');这个函数第二个参数是读取的长度,第三个参数是保留的标签(如果写了这个标签,他就不会被过滤,还是会被渲染出来)
                
                (也可以用fgets($fp);和strip_tags — 从字符串中去除 HTML 和 PHP 标记 封装一个这个函数出来,同样可以做到fgetss这个函数的效果)
                
                fgetc();只能获取一个英文字符
                
                $file_size = filesize(filename);获取文件内容的长度(因为读取文件第二个参数需要读多长,那就要知道文件有多大)
                file_exists — 检查文件或目录是否存在,在前面加 ! 是表示不存在 
                
            
            
            写入:
            fwrite(handle, string); handle往哪里写,string写入什么
    
    
    fopen(filename,mode);filename文件名和路径 mode 用什么方式读文件
    
    
    
    简易操作文件方式:
    不需要打开和关闭文件:
    file_put_contents($filename, '你好')w方式(删除之前的内容后写入)
    file_put_contents($filename, '你好', FILE_APPEND);a方式,追加内容
    
    删除文件:unlink
    
    

    //fopen(filename,mode);filename文件名和路径 mode 用什么方式读文件
    $filename = '1.txt';
    $fp = fopen($filename, 'r');//这个返回值是一个资源
    var_dump($fp);
    
    image.png

    \color{rgba(3, 101, 100, .8)}{3不代表文件里有三个项,是一个标志}
    \color{rgba(3, 101, 100, .8)}{stream表示他是一个流资源}


    \color{rgba(254, 67, 101, .8)}{r的情况,先检查文件是否存在}

    $filename = '2.txt';
    if(!file_exists($filename)){
        //file_exists — 检查文件或目录是否存在,在前面加 ! 是表示不存在
        //echo "文件{$filename}不存在";  不在这里写了,直接在die里输出就可以了
        die("文件{$filename}不存在");//die — 等同于 exit()  输出一个消息并退出
    }
    $fp = fopen($filename, 'r');//这个返回值是一个资源
    var_dump($fp);
    
    image.png

    \color{rgba(254, 67, 101, .8)}{读取文件需要知道文件的长度:}

    $filename = '1.txt';
    if(!file_exists($filename)){
        //file_exists — 检查文件或目录是否存在,在前面加 ! 是表示不存在
        //echo "文件{$filename}不存在";  不在这里写了,直接在die里输出就可以了
        die("文件{$filename}不存在");//die — 等同于 exit()  输出一个消息并退出
    }
    $fp = fopen($filename, 'r');//这个返回值是一个资源 
    //再打开一个文件的同时,先写关闭代码,省的中间写入代码太多,忘记写关闭文件代码
    
    //$str = fread(handle, length);读取文件,返回值类型是字符串  第一个参数是资源,第二个参数是读多长
    //$file_size = filesize(filename);获取文件内容的长度(因为读取文件第二个参数需要读多长,那就要知道文件有多大)
    //这里获取的是文件的字节数有多大
    
    $file_size = filesize($filename);
    $str = fread($fp, $file_size);
    echo $str;
    fclose($fp);
    
    这样写有一个问题是如果文件太大就麻烦了,所以不建议直接一次性读取文件
    可以每次读一部分
    
    image.png

    \color{rgba(254, 67, 101, .8)}{正常写法是每次读一点,不一次性全部读完:}

    $filename = '1.txt';
    if(!file_exists($filename)){
        //file_exists — 检查文件或目录是否存在,在前面加 ! 是表示不存在
        //echo "文件{$filename}不存在";  不在这里写了,直接在die里输出就可以了
        die("文件{$filename}不存在");//die — 等同于 exit()  输出一个消息并退出
    }
    $fp = fopen($filename, 'r');//这个返回值是一个资源 
    //再打开一个文件的同时,先写关闭代码,省的中间写入代码太多,忘记写关闭文件代码
    
    //$str = fread(handle, length);读取文件,返回值类型是字符串  第一个参数是资源,第二个参数是读多长
    //$file_size = filesize(filename);获取文件内容的长度(因为读取文件第二个参数需要读多长,那就要知道文件有多大)
    
    $file_size = filesize($filename);
    
    //为了以防文件太大,一点一点的读
    //需要知道文件什么时候结束,用feof()
    //feof()判断文件指针(这里简单理解为光标)是否到达文件末尾
    while(!feof($fp)){//!feof表示到文件末尾就不读了
        $str = fread($fp, 1024);
        echo $str;
    }
    
    fclose($fp);
    
    image.png

    \color{rgba(254, 67, 101, .8)}{其他的几种读取方法:}

    $str = fread($fp, 10); 读取
    $str = fgets($fp, 512); 读取一行
    $str = fgetss($fp, 512, '<h1>'); 读取一行,过滤html和php标签(但是不过滤这个h1标签)
    $str = fgetc($fp);//读取一个英文字符,

    $filename = '1.txt';
    if(!file_exists($filename)){
        //file_exists — 检查文件或目录是否存在,在前面加 ! 是表示不存在
        //echo "文件{$filename}不存在";  不在这里写了,直接在die里输出就可以了
        die("文件{$filename}不存在");//die — 等同于 exit()  输出一个消息并退出
    }
    $fp = fopen($filename, 'r');//这个返回值是一个资源 
    //再打开一个文件的同时,先写关闭代码,省的中间写入代码太多,忘记写关闭文件代码
    
    //$str = fread(handle, length);读取文件,返回值类型是字符串  第一个参数是资源,第二个参数是读多长
    //$file_size = filesize(filename);获取文件内容的长度(因为读取文件第二个参数需要读多长,那就要知道文件有多大)
    
    $file_size = filesize($filename);
    
    //为了以防文件太大,一点一点的读
    //需要知道文件什么时候结束,用feof()
    //feof()判断文件指针(这里简单理解为光标)是否到达文件末尾
    while(!feof($fp)){//!feof表示到文件末尾就不读了
        //$str = fread($fp, 10);  读取
        //$str = fgets($fp, 512);  读取一行
        //$str = fgetss($fp, 512, '<h1>');  读取一行,过滤html和php标签(但是不过滤这个h1标签)
        $str = fgetc($fp);//读取一个英文字符,
        //写在这个while循环里的话,就是一个一个的读取并输出
        
        echo $str;
    }
    
    fclose($fp);
    
    image.png

    \color{rgba(254, 67, 101, .8)}{r写入: 返回值为0}

    $filename = '1.txt';
    if(!file_exists($filename)){
        //file_exists — 检查文件或目录是否存在,在前面加 ! 是表示不存在
        //echo "文件{$filename}不存在";  不在这里写了,直接在die里输出就可以了
        die("文件{$filename}不存在");//die — 等同于 exit()  输出一个消息并退出
    }
    $fp = fopen($filename, 'r');//这个返回值是一个资源 
    //再打开一个文件的同时,先写关闭代码,省的中间写入代码太多,忘记写关闭文件代码
    
    //$str = fread(handle, length);读取文件,返回值类型是字符串  第一个参数是资源,第二个参数是读多长
    //$file_size = filesize(filename);获取文件内容的长度(因为读取文件第二个参数需要读多长,那就要知道文件有多大)
    
    $file_size = filesize($filename);
    
    $num = fwrite($fp, 'string');//返回值是数字,如果是0,就表示没有写入
    //这个例子是以 r只读方式 打开的,所以会返回0
    echo $num;
    fclose($fp);
    
    image.png

    \color{rgba(3, 101, 100, .8)}{fwrite()返回值为0表示一个内容都没有写进去}
    \color{rgba(3, 101, 100, .8)}{这里要想写入的话,除了r,其他的方式都可以写入}


    \color{rgba(254, 67, 101, .8)}{r+写入:}

    $filename = '1.txt';
    if(!file_exists($filename)){
        //file_exists — 检查文件或目录是否存在,在前面加 ! 是表示不存在
        //echo "文件{$filename}不存在";  不在这里写了,直接在die里输出就可以了
        die("文件{$filename}不存在");//die — 等同于 exit()  输出一个消息并退出
    }
    $fp = fopen($filename, 'r+');//这个返回值是一个资源 
    //再打开一个文件的同时,先写关闭代码,省的中间写入代码太多,忘记写关闭文件代码
    
    //$str = fread(handle, length);读取文件,返回值类型是字符串  第一个参数是资源,第二个参数是读多长
    //$file_size = filesize(filename);获取文件内容的长度(因为读取文件第二个参数需要读多长,那就要知道文件有多大)
    
    $file_size = filesize($filename);
    
    $num = fwrite($fp, 'string');//返回值是6,表示写进去了6个字符
    echo $num;
    fclose($fp);
    

    \color{rgba(3, 101, 100, .8)}{写入的返回值:}

    image.png

    \color{rgba(3, 101, 100, .8)}{被写入的文件:}

    image.png

    \color{rgba(254, 67, 101, .8)}{w写入:删除文件之前的内容后写入}

    $filename = '1.txt';
    if(!file_exists($filename)){
        //file_exists — 检查文件或目录是否存在,在前面加 ! 是表示不存在
        //echo "文件{$filename}不存在";  不在这里写了,直接在die里输出就可以了
        die("文件{$filename}不存在");//die — 等同于 exit()  输出一个消息并退出
    }
    $fp = fopen($filename, 'w');//w删除文件的内容,并写入新的内容
    //再打开一个文件的同时,先写关闭代码,省的中间写入代码太多,忘记写关闭文件代码
    
    //$str = fread(handle, length);读取文件,返回值类型是字符串  第一个参数是资源,第二个参数是读多长
    //$file_size = filesize(filename);获取文件内容的长度(因为读取文件第二个参数需要读多长,那就要知道文件有多大)
    
    $file_size = filesize($filename);
    
    $num = fwrite($fp, 'string');//返回值是6,表示写进去了6个字符
    echo $num;
    fclose($fp);
    

    \color{rgba(3, 101, 100, .8)}{返回值:写入字符的长度}

    image.png

    \color{rgba(3, 101, 100, .8)}{写入的文件:}
    \color{rgba(3, 101, 100, .8)}{张三 李四 王五 赵六被清除,剩下新写入的string}

    image.png

    \color{rgba(254, 67, 101, .8)}{用a写入: 追加}

    $filename = '1.txt';
    if(!file_exists($filename)){
        //file_exists — 检查文件或目录是否存在,在前面加 ! 是表示不存在
        //echo "文件{$filename}不存在";  不在这里写了,直接在die里输出就可以了
        die("文件{$filename}不存在");//die — 等同于 exit()  输出一个消息并退出
    }
    $fp = fopen($filename, 'a');//w删除文件的内容,并写入新的内容
    //再打开一个文件的同时,先写关闭代码,省的中间写入代码太多,忘记写关闭文件代码
    
    //$str = fread(handle, length);读取文件,返回值类型是字符串  第一个参数是资源,第二个参数是读多长
    //$file_size = filesize(filename);获取文件内容的长度(因为读取文件第二个参数需要读多长,那就要知道文件有多大)
    
    $file_size = filesize($filename);
    
    // for($i=0; $i<10; $i++){ //将'string'写10次
    //  $num = fwrite($fp, 'string');//返回值是6,表示写进去了6个字符
    //  echo $num;
    // }
    // 
    fwrite($fp, '你好');
    fclose($fp);
    

    \color{rgba(3, 101, 100, .8)}{之前写入的内容还在,在后面追加 新内容 }

    image.png

    \color{rgba(3, 101, 100, .8)}{此时每刷新一次就会写入一次 }
    \color{rgba(3, 101, 100, .8)}{这里如果是w写入的话,string会被清掉,而且无论刷新多少次,都只有一个 你好 }

    image.png

    \color{rgba(254, 67, 101, .8)}{简易的文件操作:}
    \color{rgba(254, 67, 101, .8)}{不需要打开和关闭文件}
    \color{rgba(254, 67, 101, .8)}{读文件:}

    $filename = '1.txt';
    $arr = file($filename);//file — 把整个文件读入一个数组中
    //如果没有这个文件,不会自动创建文件
    print_r($arr);//按换行得到的一个数组
    
    image.png

    \color{rgba(254, 67, 101, .8)}{}

    $filename = '1.txt';
    // $arr = file($filename);//file — 把整个文件读入一个数组中,如果没有这个文件,不会自动创建文件
    // print_r($arr);//按换行得到的一个数组
    
    $str =file_get_contents($filename);//返回字符串,上面file是返回数组
    echo $str;
    
    image.png

    ===================================================

    \color{rgba(254, 67, 101, .8)}{写文件:}

    $filename = '1.txt';
    echo file_put_contents($filename, '你好');
    //如果没有文件,先自动创建文件,再写入
    //他是以w方式写入的,会清除之前的内容后再写入
    //返回值是写入成功的数量
    

    \color{rgba(3, 101, 100, .8)}{返回值是写入成功的数量(成功写入多少个字符)}

    image.png

    \color{rgba(3, 101, 100, .8)}{被写入的文件:以w方式写入的,先删除之前的内容,再写入}

    image.png

    \color{rgba(254, 67, 101, .8)}{如果不清除,需要追加,就在后面给第三个参数:FILE\_APPEND}
    \color{rgba(254, 67, 101, .8)}{这是a的写法,a就是append,追加}

    $filename = '1.txt';
    echo file_put_contents($filename, '你好', FILE_APPEND);
    //不写FILE_APPEND会清除之前的内容后再写入新内容
    //写了FILE_APPEND,只会追加新内容
    
    image.png

    \color{rgba(254, 67, 101, .8)}{删除文件:unlink}

    $filename = '1.txt';
    unlink($filename);
    
    运行后,文件被删掉了
    


    \color{rgba(254, 67, 101, .8)}{之前的办法都只能写入字符串,不能写入一个数组}

    $student = ['name'=>'张三', 'sex'=>'男', 'age'=>20];
    // $class = [
    //  ['name'=>'张三', 'sex'=>'男', 'age'=>18];
    //  ['name'=>'李四', 'sex'=>'男', 'age'=>19];
    //  ['name'=>'李雷', 'sex'=>'男', 'age'=>20];
    //  ['name'=>'LUCY', 'sex'=>'女', 'age'=>17];
    // ]
    // 
    
    $filename = 'class.txt';
    echo file_put_contents($filename, $student, FILE_APPEND);//将$student数组写入$filename中
    

    \color{rgba(3, 101, 100, .8)}{返回值:}

    image.png

    \color{rgba(3, 101, 100, .8)}{文件中写入的结果:}
    \color{rgba(3, 101, 100, .8)}{这个结果有问题,再遍历这个数组取值的话不好取}

    image.png

    \color{rgba(254, 67, 101, .8)}{把数组变成字符串叫做 数组的序列化}
    \color{rgba(3, 101, 100, .8)}{json\_encode 返回字符串}

    $student = ['name'=>'张三', 'sex'=>'男', 'age'=>20];
    
    $student = json_encode($student);
    echo $student;
    

    \color{rgba(3, 101, 100, .8)}{返回值是一个字符串:}
    \color{rgba(254, 67, 101, .8)}{(存的时候,就存这个字符串,每个学生信息占一行,取的时候好取)}

    image.png

    \color{rgba(3, 101, 100, .8)}{json\_encode();的作用就是把数组转换为json格式的字符串}
    \color{rgba(3, 101, 100, .8)}{这是数组的序列化}

    \color{rgba(3, 101, 100, .8)}{json\_decode();的作用就是把json格式的字符串转换为数组}
    \color{rgba(3, 101, 100, .8)}{json\_decode();写true就是数组,不写就是返回对象}
    \color{rgba(3, 101, 100, .8)}{这是数组的反序列化}

    \color{rgba(3, 101, 100, .8)}{json\_decode:返回数组}

    $student = ['name'=>'张三', 'sex'=>'男', 'age'=>20];
    // $class = [
    //  ['name'=>'张三', 'sex'=>'男', 'age'=>18];
    //  ['name'=>'李四', 'sex'=>'男', 'age'=>19];
    //  ['name'=>'李雷', 'sex'=>'男', 'age'=>20];
    //  ['name'=>'LUCY', 'sex'=>'女', 'age'=>17];
    // ]
    // 
    
    $student = json_encode($student);
    $str = '{"name":"\u5f20\u4e09","sex":"\u7537","age":20}';
    $student = json_decode($str, true);
    print_r($student);//这个数组会返回一个对象类型,因为这个数组是一个关联数组,所以,$str后面还要跟第二个参数,true,保证他之前是什么类型,转换之后还是什么类型
    
    image.png

    \color{rgba(254, 67, 101, .8)}{将数组转为字符串保存的结果:}

    $student = ['name'=>'张三', 'sex'=>'男', 'age'=>20];
    
    $student = json_encode($student);//把数组转成json格式的字符串
    $filename = 'class.txt';
    echo file_put_contents($filename, $student."\n", FILE_APPEND);//$student."\n"  这个\n是换行
    

    \color{rgba(3, 101, 100, .8)}{文件中写入的内容是这样的:}

    image.png

    \color{rgba(3, 101, 100, .8)}{上面这个保存的字符串读出来是这样:}

    $student = ['name'=>'张三', 'sex'=>'男', 'age'=>20];
    
    
    $student = json_encode($student);//把数组转成json格式的字符串
    $filename = 'class.txt';
    //echo file_put_contents($filename, $student."\n", FILE_APPEND);$student."\n"  这个\n是换行
    
    $class = file($filename);
    print_r($class);
    
    image.png
    $student = ['name'=>'张三', 'sex'=>'男', 'age'=>20];
    
    
    /* $student = json_encode($student);//把数组转成json格式的字符串 */
    $filename = 'class.txt';
    $class = file($filename);
    foreach($class as $k=>$v){
        $lass[$k] = json_decode($v, true);
        //将字符串反序列化(转为数组)后保存
        //此时$class已经是一个二维数组了
    }
    print_r($class);
    

    \color{rgba(3, 101, 100, .8)}{返回值:}

    image.png

    \color{rgba(3, 101, 100, .8)}{源码:}

    image.png

    \color{rgba(254, 67, 101, .8)}{如果要将一个预先写好的数组显示在表格中:}

    $student = ['name'=>'张三', 'sex'=>'男', 'age'=>20];
    
    $filename = 'class.txt';
    
    $class = file($filename);
    foreach($class as $k=>$v){
        $class[$k] = json_decode($v, true);
    }
    
    ?>
        
        
        
        
            
    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title></title>
    </head>
    <body>
        <table width="800" border="1" align="center">
            
            <tr>
                <th>姓名</th>
                <th>性别</th>
                <th>年龄</th>
                <th>操作</th>
            </tr>
            
            <?php
                foreach($class as $v){
                    echo "<tr align='center'><td>{$v['name']}</td><td>{$v['sex']}</td><td>{$v['age']}</td><td>修改|删除</td></tr>";
                }   
            ?>
            
        </table>
    </body>
    </html>
    
    

    \color{rgba(3, 101, 100, .8)}{文件中的数组:}

    image.png

    \color{rgba(3, 101, 100, .8)}{显示的返回值:}

    image.png

    \color{rgba(254, 67, 101, .8)}{上面这个例子有一个问题,就是遍历文件之前要先判断是否有这个文件}

    \color{rgba(254, 67, 101, .8)}{上面例子进阶:}
    \color{rgba(254, 67, 101, .8)}{1.先判断文件是否存在;}
    \color{rgba(254, 67, 101, .8)}{2.再建一个添加学生页面(录入学生信息的页面)}

    \color{rgba(254, 67, 101, .8)}{例子:一个页面添加学生信息,一个页面显示学生信息}

    \color{rgba(254, 67, 101, .8)}{此页面显示学生信息:}

    $student = ['name'=>'张三', 'sex'=>'男', 'age'=>20];
    
    /*$student = json_encode($student);//把数组转成json格式的字符串  */  
    $filename = 'class.txt';
    
    $class = [];
    if(file_exists($filename)){
        //file_exists — 检查文件或目录是否存在
        //处理这个文件之前要先检查文件是否存在
        //有这个文件才执行,没有就不执行了
        
    $class = file($filename);
        foreach($class as $k=>$v){
            $class[$k] = json_decode($v, true);
        }
    }
    ?>
        
        
        
        
            
    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <title>学生列表</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title></title>
    </head>
    <body>
        <table width="800" border="1" align="center">
            <caption><a href="add.php">添加学生</a></caption>
            <tr>
                <th>姓名</th>
                <th>性别</th>
                <th>年龄</th>
                <th>操作</th>
            </tr>
            
            <?php
                foreach($class as $v){
                    echo "<tr align='center'><td>{$v['name']}</td><td>{$v['sex']}</td><td>{$v['age']}</td><td>修改|删除</td></tr>";
                }   
            ?>
            
        </table>
    </body>
    </html>
    

    \color{rgba(3, 101, 100, .8)}{成功添加了两个学生信息在class.txt中并显示在此页面}

    image.png image.png

    \color{rgba(254, 67, 101, .8)}{此页面添加学生信息:}

    <?php
        if(!empty($_POST)){//如果下面的post不为空,就操作
            /* print_r($_POST);//此时接收到的数据是一个列表 */
            $student = $_POST;//将获取到的值赋给$student
            $student = json_encode($student);//将接收到的值(数组)转换成字符串
            $num = file_put_contents('class.txt', $student."\n", FILE_APPEND);//将转换好的字符串保存
            if($num > 0){//验证$num是否收到数据,大于0就成功,否则失败
                die("<script>alert('添加成功'); location.href='study.php';</script>");//成功就输出并且跳转到显示页面
            }else{
                die("<script>alert('添加失败');location.href='add.php';</script>");//失败也输出信息但是停在此页面
            }
        }
    ?>
    
    
    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <title>添加学生</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title></title>
    </head>
    <body>
        <h3>添加学生</h3>
        <form action="" method='post'>
            <p>姓名: <input type="text" name="name"></p>
            <p>性别: <input type="radio" name="sex" value="男" checked/>男 <input type="radio" name="sex" value="女" />女</p>
            <p>年龄: <input type="text" name="age"></p>
            <p><button>提交</button></p>
        </form>
    </body>
    </html>
    
    image.png

    \color{rgba(3, 101, 100, .8)}{}
    绿:内容

    \color{rgba(254, 67, 101, .8)}{}

    红:标题`

    相关文章

      网友评论

          本文标题:PHP -- 文件操作1

          本文链接:https://www.haomeiwen.com/subject/tyyvdctx.html