当前位置: 首页 > news >正文

(独孤九剑)--文件系统

【一】文件系统概述

文件的创建,删除,编辑,复制,粘贴(移动),即文件的增删改查

 

【二】读取文件

打开读取:readfile(string),传入文件路径即可打开读取(如读取成功,则返回字节数)

打开赋值给变量:file_get_contents(),返回字符型

打开读取关闭分步操作:fopen,fread,fclose

①fopen有两个参数,fopen(打开路径,打开方式),打开方式为只读 / 读写

②fread有两个参数,fread(读取文件名,可选,读取最大字节限制)

③fclose关闭文件,以免打开的文件占用服务器资源

fopen打开文件模式列表:

r      只读,将文件指针指向文件头;

r+    读写,将文件指针指向文件头;

w     写入方式打开,将文件指针指向文件头并将文件大小截取为0。如果文件不存在则创建文件

w+   读写方式打开,将文件指针指向文件头并将文件大小截取为0。如果文件不存在则创建文件

a      写入方式打开,将文件指针指向文件尾部。如果文件不存在则创建文件

a+    读写方式打开,将文件指针指向文件尾部。如果文件不存在则创建文件

x      创建并以写入方式打开。如果已存在,则fopen()调用失败返回FALSE,并生成一条E_WARNING警告级别的错误信息。如果文件不存在则尝试创建

x+    创建并以读写方式打开。...

模式对比

 r     只能读,不能fwrite写;

r+    可读可写;

w     只能写(将文件指针指向文件头,所以会覆盖)

w+   可读可写(将文件指针指向文件头,所以会覆盖)

a      只能写(将文件指针指向文件尾部,所以会追加)

a+    可读可写(将文件指针指向文件尾部,所以会追加)

a模式与w模式对比

a模式为追加(存在时覆盖),w模式为覆盖(存在时覆盖),x模式覆盖(存在时报错警告)

 

【三】创建修改文件内容

(1)获取文件内容

     file_get_contents返回字符串

不存在则报错,警告错误
$contents = file_get_contents('./new.txt');
echo "$contents";

(2)写入文件内容

   file_put_contents返回字节长度

        向指定文件写入字符串,如果不存在则创建文件,并返回写入的字节长度

<?php
    $data = "我是新内容";
    $contents = file_put_contents('../tools/demo.txt',$data);
    if($contents){
        echo "写入成功,内容为:".file_get_contents('../tools/demo.txt');
    }else{
        echo "写入失败或没有权限";
    }
?>

(3)fwrite写入内容

 fwrite配合fopen可以进行写入操作,别名是fputs

如果不存在则会创建文件;有的话会覆盖原有文件内容

 

【四】创建临时文件

之前创建的文件为永久文件,fopen()代开文件时x,w,a,x+,w+,a+等模式打开文件时,均会创建永久文件

而平时项目开发里,临时文件也经常用到。

好处:用完即删,不用去维护文件的删除状态

语法:tmpfile()

注意:因为临时文件没有具体路径,所以无法读取文件具体信息,只能返回字节数

<?php
    $file = tmpfile();//创建临时文件
    $content = "向临时文件写入内容";
    $numbytes = fwrite($file, $content);//读取临时文件
    fclose($file);//关闭临时文件,即被删除
    echo "写入了".$numbytes."个字节";
?>

 

【五】复制,粘贴(移动),重命名,删除文件

(1)重命名 / 移动:rename(旧名,新名)

<?php
    fopen('file.txt', 'w+');//创建文件
    $filename = 'file.txt';//旧文件
    $filename2 = '../demo/newfile.txt';//移动到目标文件,并重命名,也可以原名
    rename($filename,$filename2);
?>

若文件不存在则会报错警告(警告级别错误),脚本继续执行

(2)复制 / 粘贴移动:copy(源文件,目标文件)

<?php
    fopen('file.txt', 'w+');//创建文件
    $filename = 'file.txt';//源文件
    $filename2 = '../demo/copyfile.txt';//目标文件,复制并重命名
    copy($filename,$filename2);
?>

区别:虽然复制和重命名都可以使得目标文件夹下有文件,但是复制命令会保留原先位置文件,而重命名的移动会使原先目标位置文件移除

(3)删除文件

unlink(指定文件路径)

<?php
    if(unlink('../demo/newfile.txt')){
        echo "删除成功";
    }else{
        echo "删除失败";
    }
?>

注意:人工操作删除后,windows回收站可以看到;但是通过此方法删除的在回收站找不到

 

【六】检测文件属性函数

(1)使用场景举例:

         ①文件锁----安装软件时,如果软件已经存在,就不让进行安装;

         ②安装过程里,如果没有写入权限,则不执行安装;

(2)函数

         ①文件是否存在file_exists()

<?php
    fopen('./file.txt', 'w+');
    if(file_exists('./file.txt')){
        echo "文件存在";
    }else{
        echo "文件不存在";
    }
?>

        ②文件是否可读is_readable()

        ③文件是否可写is_writeable()

<?php
    $myfile = fopen('./file.txt', 'w+');
    if(is_readable('./file.txt')&&is_writable('./file.txt')){
        echo "文件可读可写";
    }else{
        echo "文件不可读也不可写";
    };
    fclose($myfile);
?>

        ④文件是否可执行is_executable()

<?php
    $myfile = fopen('./index.php', 'w+');
    if(is_executable('./index.php')){
        echo "文件可执行";
    }else{
        echo "文件不可执行"; 
    };
    fclose($myfile);//如果文件不可执行则会被关闭
?>

       ⑤是否是文件is_file()

       ⑥是否是目录is_dir()

       ⑦清除文件缓存clearstatcache()

(3)场景举例

①文件锁

安装时如果文件已经存在,则提示已经安装。否则会继续安装

<?php
    if(file_exists('./file.txt')){
        echo "文件已经存在";
exit;//与die()类似,结束脚本 }
else{ echo "确定安装"; }; ?>

 

【七】文件常用函数和常量

(1)文件目录分隔符

Window平台下为 \ ,例如C:\PHPTutorial\WWW;而Linux平台下为 /

注意:windows下也支持 / , 但Linux下不能识别 \ ,所以开发时最好写 /

<?php
    $path = $_SERVER['SCRIPT_NAME'];
    echo "当前脚本路径为".$path;
?>

对于 / 有个转 / 为 \ 路径的案例,不太理解,备注下???

(2)文件指针操作函数

①指针回到开始处rewind()

②指针向后移动指定字节fseek()

    注意:fread()读取指定长度数组,下次读取时会从原位置接着向后读取

<?php
    $file = fopen('./test.txt', 'w+');
    $data = "我是输入的数据,我叫Tony";
    $content = file_put_contents('./test.txt', $data);
    echo fread($file, 6)."<br>";//读取到第六个字节
    rewind($file);//向前移动六个字节
    echo fread($file, 6)."<br>";//读取到第六个字节
    fseek($file, 6);//向后移动六个字节
    echo fread($file, 6);//从第6个字节开始读取
    fclose($file);
?>

(3)检测文件大小,统计字节数filesize()

    如果想直接移动到最后,则需要先统计字节数,这时用到filesize()

(4)把整个文件读入一个数组里--------file

(5)从文件指针中读取一行,读到最后返回false---fgets

(6)从文件指针中读取一个字符,读到最后返回false---fgetc

(7)将文件截取到指定的长度--ftruncate

(8)文件时间函数

         主要为创建,修改,上次访问时间

         ①filectime();创建时间;②filemtime();修改时间;③fileatime();上次访问时间

<?php
    $file = fopen('./test.txt', 'w+');
    $time1 = filectime('./test.txt');//创建时间
    $time2 = filemtime('./test.txt');//修改时间
    $time3 = fileatime('./test.txt');//上次访问时间
    fclose($file);
?>

 

【八】文件锁处机制

文件锁的用途:

锁定文件,例如当两个人同时打开一个文件编辑保存时权限问题,所以禁止多人同时操作文件

注意:不论是否加了文件锁,都要释放

锁属性

LOCK_SH       取得共享锁定(读取的程序)

LOCK_EX       取得独占锁定(写入的程序)

LOCK_UN      释放锁定(无论独占或共享)

<?php
    $file = fopen('./test.txt', 'w+');
    //进行排他锁的锁定
    if(flock($file, LOCK_EX)){
        fwrite($file, "这时我独占了文件");
        //释放锁定
        flock($file, LOCK_UN);
    }else{
        echo "锁失败,可能有人在操作,此时无法上锁";
    }
    fclose($file);
?>

 

【九】目录处理 / 文件夹处理

之前的都是文件处理,这里介绍下目录和文件夹的处理函数(PS:目录就是文件夹,文件夹就是目录)

(1)处理文件夹基本思路:

①读取某路径的时候判断是否是文件夹;

②是文件夹的话,打开指定文件夹,返回文件目录的资源变量;

③readdir逐个读取目录中的文件,每读取一个,文件指针后移一次;

④使用readdir读取到最后,没有可读文件返回false;

⑤关闭文件目录

(2)文件夹 / 目录处理函数

is_dir        判断是否是文件夹

opendir     打开文件夹,返回操作资源

readdir     读取操作资源

closedir    关闭文件夹操作资源

filetype     判断文件 / 文件夹,文件显示file,文件夹显示dir

<?php
    $dir = 'd:/';
    if(is_dir($dir)){
        if($dn = opendir($dir)){
            echo readdir($dn)."<br>";
            echo readdir($dn)."<br>";
            echo readdir($dn)."<br>";
            echo readdir($dn)."<br>";
            echo readdir($dn)."<br>";
            echo readdir($dn)."<br>";
            closedir($dn);
        }
    }else{
        echo "不是文件夹";
    }
?>

一次性读取完

<?php
    $dir = '../WWW';
    if(is_dir($dir)){
        if($dn = opendir($dir)){
            while (($file = readdir($dn)) !== false) {
                echo "文件名是:".$file.";"."文件类型是:".filetype($dir.$$file)."<br>";
            }
            closedir($dn);
        }
    }else{
        echo "不是文件夹";
    }
?>

 

【十】文件权限设置

使用场景:普通用户只能读取,不可以操作

chmod    修改读取模式

chgrp     修改用户组

chown    修改权限

 

【十一】文件路径函数

(1)使用场景

①去除文件后缀;

②路径里只取名字,不取目录;

③只取路径名中的目录路径;

④解析网址中各部分,取得独立值;

⑤自己组个url;

(2)常用路径处理函数

pathinfo             返回文件各个组成部分

basename         返回文件名

dirname             文件目录

parse_url           解析网址

http_build_query   生成url中query字符串

http_build_url        生成一个url

 

①pathinfo             返回文件各个组成部分

 解析网址的3种方法,我在文章http://570109268.iteye.com/admin/blogs/2413423里做了总结

<?php
    $path_part = pathinfo('c:/PHPTutorial/WWW/index.php');
    echo "文件目录名:".$path_part['dirname']."<br>";
    echo "文件全面:".$path_part['basename']."<br>";
    echo "文件扩展名:".$path_part['extension']."<br>";
    echo "不包含扩展的文件名:".$path_part['filename']."<br>";
?>

输出结果:

文件目录名:c:/PHPTutorial/WWW
文件全面:index.php
文件扩展名:php
不包含扩展的文件名:index

②basename        返回文件名

语法:basename(路径,后缀可选)

<?php
$path = "/testweb/home.php";
//显示带有文件扩展名的文件名
echo basename($path);//输出home.php
//显示不带有文件扩展名的文件名
echo basename($path,".php");//输出home
?> 

③dirname     文件目录

④http_build_query()   绑定参数

作用:生成url种的query字符串,使用给出的关联(或下标)数组生成一个经过 URL-encode 的请求字符串

<?php
    $user = array('name' => 'Tony', 'age' => 23);
    $userInfo = http_build_query($user);
    echo $userInfo;
?>

这个有什么用呢,这是模拟http请求的,把得到的数据data通过函数URL-encode,一般是用在回调

 

【十二】PHP实现文件留言本

主要用到数据存储于读取

 

【十三】PHP修改配置文件

 PHP可以编写修改配置文件

转载于:https://www.cnblogs.com/jianxian/p/8587942.html

相关文章:

  • Laravel常见问题集锦
  • v0.1beta
  • HDU 4923 Room and Moor(推理+栈维护)
  • linux hosts.equiv设置解析
  • js脚本 将本地图片路径转换为html
  • Python3连接MySQL
  • FineBI学习系列之FineBI的Windows里安装步骤(图文详解)
  • 初次尝试单元测试
  • 突发奇想 应用商店的会员模式
  • Swift 基本数据类型
  • iterator取集合元素
  • 前端ps切图,图文教程,详细。
  • android6.0以上权限动态申请,有视频链接可以看效果。
  • svm资料收集
  • java学习--基础知识第四天--笔记
  • Apache Spark Streaming 使用实例
  • DataBase in Android
  • ES6 ...操作符
  • JavaScript 奇技淫巧
  • SQLServer之创建显式事务
  • vagrant 添加本地 box 安装 laravel homestead
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 和 || 运算
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 我是如何设计 Upload 上传组件的
  • 优秀架构师必须掌握的架构思维
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 昨天1024程序员节,我故意写了个死循环~
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #define
  • #NOIP 2014# day.1 T2 联合权值
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (libusb) usb口自动刷新
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)LINQ之路
  • (转)linux 命令大全
  • .CSS-hover 的解释
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .Net - 类的介绍
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET程序员迈向卓越的必由之路
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .sh
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [Bada开发]初步入口函数介绍
  • [BZOJ 3680]吊打XXX(模拟退火)
  • [c++] C++多态(虚函数和虚继承)
  • [C++] 多线程编程-thread::yield()-sleep_for()