【PHP】文件操作

news2024/11/28 22:54:35

文章目录

  • 文件编程的必要性
  • 目录操作
  • 其它目录操作
  • 递归遍历目录
  • PHP5常见文件操作函数
  • PHP4常见文件操作函数
  • 其他文件操作函数

文件编程的必要性

文件编程指利用PHP代码针对文件(文件夹)进行增删改查操作。

在实际开发项目中,会有很多内容(文件上传、配置文件等)具有很多不确定性,不能在一开始就手动的创建,需要根据实际需求和数据本身来进行管理,这个时候就可以使用PHP文件编程来实现代码批量控制和其他操作。


文件操作的分类

1) 目录操作:文件夹,用来存放文件的特殊文件

2) 文件操作:用来存放内容

目录操作

创建目录

1.mkdir(目录名):创建成功返回true,创建失败返回false

2.创建目录可以结合错误抑制符使用。因为有些操作为的就是得到一个想要的结果,如果结果本身就存在,那么可以忽略得到过程的错误:抑制错误。

  • 例如:上面想要创建的文件夹本身就存在
$res = @mkdir('dir');

删除目录

rmdir(指定文件夹路径):移出文件夹

@rmdir('dir');

读取目录

读取方式:将文件夹(路径)按照资源方式打开

1.opendir(目录名):打开资源,返回一个路径资源,包含指定目录下的所有文件(文件夹)

2.readdir(路径资源):从资源中读取指针所在位置的文件名字,然后指针下移,直到指针移出资源

  • 如果想要读取所有内容,那么此时可以使用while或者for进行循环操作
$r = @opendir('dir');
while($file = readdir($r))
{
    echo $file,'<br/>';
}

关闭目录

closedir(路径资源)


其它目录操作

1)dirname(路径):得到的是路径的上一层路径

  • 作用:可以得到路径的前缀
$dir1 = 'D:/Mango/Lemon/Test.php';
$dir2 = 'D:/Mango/Lemon/Test/test.php';
echo dirname($dir1)," ",dirname($dir2);//D:/Mango/Lemon  D:/Mango/Lemon/Test

注意:dirname只是根据字符串返回,无论该路径在电脑上是否存在

2)realPath(一个路径):如果文件存在,返回该文件路径。如果文件不存在,返回false

$dir1 = 'Z:/1.md';
$dir2 = 'Z:/2.md';
var_dump(realpath($dir1),realpath($dir2));//string(7) "Z:\1.md" bool(false)

3)is_dir(路径):判断指定路径是否是一个目录,如果该路径不存在&不是目录:返回false

$dir1 = 'D:/';
$dir2 = 'D:/Mango/Lemon/Test/test.php';
var_dump(is_dir($dir1),is_dir($dir2));//bool(true) bool(false)

4)scandir(路径):封装版的opendir+readdir+closedir,获取一个指定路径下的所有文件信息,以数组形式返回

var_dump(scandir('dir'));//array(3) { [0]=> string(1) "." [1]=> string(2) ".." [2]=> string(4) "ddir" }

递归遍历目录

递归遍历目录:指定一个目录的情况下,将其下的所有文件和目录,及其目录内部的所有内容都输出出来。

思路

  • 设计一个能够遍历一层文件的函数function my_scandir($dir)

1.首先要判断$dir是否是目录,如果不是目录,直接终止

2.使用scandir读取dir目录下的所有内容(文件+子目录)

3.遍历读取到的所有内容

  • 此时需要构造文件路径(因为遍历得到的结果只是文件的名字) & 并且需要排除...文件,否则会导致死循环

  • 找到递归点:遍历得到的文件是目录,应该调用当前函数(调用自己),判断构建好的路径是目录还是普通文件,如果是目录,则调用自身函数

4.找到递归出口:遍历完这个文件夹之后,发现没有任何子文件夹(函数不再调用自己):自带递归出口

问题:如何显示层级关系

函数第一次运行遍历的结果是最外层目录,内部调用一次说明进入一个子目录,子目录再调用一次函数进入孙子目录,如果能够在第一次调用的时候给个标记,然后在进入的时候,通过标记的变化来识别层级关系,就可以达到目的:该标记还能代表层次关系:缩进

方法:可以在函数当中多增加一个参数,默认值为0,标识最外层

  • 递归调用函数的时候也需要使用该参数:但是是属于当前层级的子层,所以+1

注意:递归调用的时候,是level+1,而不是level++,因为要回溯回来,如果是++就会导致level的值发生改变

根据层级来实现缩进

可以使用str_repeat函数,作用是:重复一个字符串多少次,在这里我们的层级用空格来表示即可

  • str_repeat("&nbsp;&nbsp;",$level)) ==>重复两个空格level次

整体代码

//递归遍历目录
//参数1:路径名  参数2:当前层级,默认是0,表示最外层
function my_scandir($dir,$level = 0)
{
    //1.首先判断该路径是否是一个目录,如果不是,直接结束
    if(!is_dir($dir))
        die($dir.'<br/>'); //die() 函数输出一条消息,并退出当前脚本。

    //2.使用scandir函数获取当前路径下所有文件信息,以数组形式返回
    $file_array = scandir($dir);

    //3.遍历路径下的所有内容
    foreach($file_array as $file)
    {
        //$file代表的就是文件名/文件夹名
        //根据文件层级显示对应的空格数
        echo str_repeat("&nbsp;&nbsp;",$level),$file.'<br/>';

        //排除.和..  防止死递归
        if($file == '.' || $file == '..') 
            continue;

        //因为$file只是文件名,所以要构造路径
        $file_dir = $dir.'/'.$file; //利用到了 .连接符
        //验证: echo $file_dir;

        //如果是目录,那么就递归
        if(is_dir($file_dir))
            my_scandir($file_dir,$level+1);
    }
}
$dir = 'dir';
my_scandir($dir);

效果

image-20230802144808964


PHP5常见文件操作函数

1)file_get_contents(文件路径):获取指定文件的所有内容

  • 如果路径不存在最好做安全处理 ==> 错误抑制
$file = 'read.txt';
$content = @file_get_contents($file);
echo $content;//hello I am read.txt Mango Lemon

2)file_put_contents(文件路径,内容)将指定内容写入到指定文件内:如果当前路径下不存在指定的文件,函数会自动创建(如果路径不存在,不会创建路径)

  • 返回值:返回写入的字符串长度(字节)
$file = 'read.txt';
// $content = @file_get_contents($file);
$test = 'hello world';
$res = file_put_contents($file,$test);

echo $res;//11

PHP4常见文件操作函数

PHP4中是将文件操作用资源形式处理:不论是读还是写都依赖资源指针:文件内容中指针所在位置

1)fopen(文件路径,打开模式):打开一个文件资源,返回值资源指针,要指定打开模式

2)fread(资源指针,长度):从打开的资源中读取指定长度的内容(字节)

3)fwrite(资源指针,内容):向打开的资源中写入指定的内容

4)fclose(资源):关闭资源

$file_name = 'read.txt';
$fp = fopen($file_name,'r');//以读方式打开
$content = fread($fp,1024);
echo $content; //hello world hello world dwadaw dwadaw
fclose($fp);

其他文件操作函数

1)is_file():判断文件是否正确(不识别路径)

$filename = 'example.txt';
if (is_file($filename)) {
    echo "The file exists and is a regular file.";
} else {
    echo "The file does not exist or is not a regular file.";
}

2)filesize():获取文件大小

$filename = 'example.txt';
$filesize = filesize($filename);
echo "The size of the file is: " . $filesize . " bytes";

3)file_exists():判断文件是否存在(识别路径)

$filename = 'example.txt';
if (file_exists($filename)) {
    echo "The file exists.";
} else {
    echo "The file does not exist.";
}

4)unlink():取消文件名字与磁盘地址的连接(删除文件)

$filename = 'example.txt';
if (file_exists($filename)) {
    unlink($filename);
    echo "File deleted successfully.";
} else {
    echo "File does not exist, cannot delete.";
}

5)filemtime():获取文件最后一次修改的时间

$filename = 'example.txt';
if (file_exists($filename)) {
    $lastModified = filemtime($filename);
    echo "Last modified: " . date("Y-m-d H:i:s", $lastModified);
} else {
    echo "File does not exist.";
}

6)fseek():设定fopen打开的文件的指针位置

$filename = 'example.txt';
$fp = fopen($filename, 'r');
fseek($fp, 50); // Set the pointer position to byte 50 from the beginning of the file
// Perform other operations here, like reading or writing
fclose($fp);

7)fgetc():一次获取一个字符

$filename = 'example.txt';
$fp = fopen($filename, 'r');
$char = fgetc($fp); // Read one character from the file
echo "The first character in the file is: " . $char;
fclose($fp);

8)fgets():一次获取一个字符串(默认行)

$filename = 'example.txt';
$fp = fopen($filename, 'r');
$line = fgets($fp); // Read one line from the file
echo "The first line in the file is: " . $line;
fclose($fp);
	

9)file():读取整个文件,类似file_get_contents,区别是按行读取,返回一个数组

$filename = 'example.txt';
$lines = file($filename); // Read the entire file into an array
foreach ($lines as $line) {
    echo $line . "<br>";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/951979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kafka原理与应用

架构图 Broker Kafka集群包含多个服务器&#xff0c;服务器节点称为BrokerBroker存储Topic数据 如果某topic有N个partition&#xff0c;集群有N个broker&#xff0c;那么每个broker存储该topic的一个partition。如果某topic有N个partition&#xff0c;集群有(NM)个broker&#…

【期末复习笔记】计算机操作系统

计算机操作系统 进程的描述与控制程序执行进程进程的定义与特征相关概念定义特征进程与程序的区别 进程的基本状态和转换PCBPCB中的信息作用PCB的组织方式 线程进程与线程的比较 处理机调度与死锁处理机调度处理机调度的层次 调度算法处理机调度算法的目标处理机调度算法的共同…

C++ 多重继承

所谓多重继承就是一个儿子有好几个爹&#xff0c;然后一个人继承了这几个爹的财产。只需注意构造顺序即可&#xff0c;反正析构的顺序也是一样的。 #include <iostream> #include <string.h> using namespace std;class base_a { public:base_a(const char *str){…

内网隧道技术学习

1. 隧道技术 在进行渗透测试以及攻防演练的时候&#xff0c;通常会存在各种边界设备、软硬件防火墙、IPS等设备来检测外部连接情况&#xff0c;这些设备如果发现异常&#xff0c;就会对通信进行阻断。 那么隧道技术就是一种绕过端口屏蔽的通信方式&#xff0c;在实际情况中防…

自用Eclipse配置记录

喜欢用eclipse写代码&#xff0c;由于现在的eclipse配置导出的功能缺失较多。这里开一帖把本人常用的配置记录一番&#xff0c;省得再到处找。 另&#xff1a;工作空间中有个.metadata 目录保存了相关的插件及配置&#xff0c;可以复制到其他空工作间中复用配置。 设置工作空间…

【Tkinter系列07/15】小部件Message、下拉菜单、移动窗

17. 小部件Message 此小部件类似于小部件 &#xff08;请参见第 12 节 “标签小部件”&#xff09;&#xff0c;但它适用于 在多行上显示消息。所有文本将 以相同的字体显示;如果需要显示文本 使用多种字体&#xff0c;请参见第 24 节 “文本小部件”。Label 创建新构件作为子…

【AI】数学基础——数理统计(概念参数估计)

概率论 文章目录 3.6 数理统计概念与定理3.6.1 概率论与数理统计区别3.6.2 基本定理大数定理马尔科夫不等式切比雪夫不等式中心极限定理 3.6.3 统计推断的基本问题 3.7 参数估计3.7.1 频率派点估计法矩阵估计法极大似然估计点估计量的评估 区间估计 3.7.2 贝叶斯派贝叶斯定理条…

26、ADS瞬时波形仿真-TRANSIENT仿真(以共射放大器为例)

26、ADS瞬时波形仿真-TRANSIENT仿真&#xff08;以共射放大器为例&#xff09; 在本科期间&#xff0c;学习模电的时候总是要对各种三极管电路进行MULTISIM仿真&#xff0c;其实ADS具备相同的功能&#xff0c;而且对于射频电路&#xff0c;使用ADS进行仿真可以结合版图进行&am…

SpringBoot初级开发--整体应用的统一性异常管理(7)

在整个系统中&#xff0c;通常会要求有统一性的异常抛出&#xff0c;统一的异常格式&#xff0c;统一的异常界面&#xff0c;而不是把整个堆栈错误信息抛出&#xff0c;这样对整个系统的安全性以及错误定位都非常不好&#xff0c;接下来我们紧接上一章的源码&#xff0c;加上统…

23.手风琴效果

效果 源码 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>CSS Only Accordion Design</title><link rel="stylesheet" href="style.css"> </head> <bod…

ChatGPT辅助编写自动化测试

大家好&#xff0c;我是洋子&#xff0c;ChatGPT已经越来越火爆&#xff0c;国内百度、阿里等互联网大厂也纷纷投入大模型研究&#xff0c;OpenAI官网中提供了许多ChatGPT应用场景&#xff0c;例如SQL翻译、语言翻译、代码解释等 作为一名QA&#xff0c;我更关注ChatGPT生成的…

【全面讲解】CPU缓存一致性:从理论到实战(上)

本文从 CPU、缓存、内存屏障、CAS到原子操作&#xff0c;再到无锁实践&#xff0c;逐一详细介绍。 01存储体系结构 速度快的存储硬件成本高、容量小&#xff0c;速度慢的成本低、容量大。为了权衡成本和速度&#xff0c;计算机存储分了很多层次&#xff0c;扬长避短&#xff…

动态主机配置协议 (DHCP):简化网络中IP地址分配的利器

文章目录 一、引言二、什么是DHCP&#xff1f;三、DHCP的工作原理IP地址分配流程解决多服务器冲突IP地址租约更新 四、DHCP中继代理五、相关命令 首先可以看下思维导图&#xff0c;以便更好的理解接下来的内容。 一、引言 在局域网中&#xff0c;手动配置静态IP地址不仅繁琐…

22.3D等距社交媒体菜单的悬停特效

效果 源码 <!doctype html> <html><head><meta charset="utf-8"><title>CSS Isometric Social Media Menu</title><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.…

ThinkPHP 集成 jwt 技术 token 验证

ThinkPHP 集成 jwt 技术 token 验证 一、思路流程二、安装 firebase/php-jwt三、封装token类四、创建中间件&#xff0c;检验Token校验时效性五、配置路由中间件六、写几个测试方法&#xff0c;通过postman去验证 一、思路流程 客户端使用用户名和密码请求登录服务端收到请求&…

Android-关于页面卡顿的排查工具与监测方案

作者&#xff1a;一碗清汤面 前言 关于卡顿这件事已经是老生常谈了&#xff0c;卡顿对于用户来说是敏感的&#xff0c;容易被用户直接感受到的。那么究其原因&#xff0c;卡顿该如何定义&#xff0c;对于卡顿的发生该如何排查问题&#xff0c;当线上用户卡顿时&#xff0c;在线…

Android Aidl跨进程通讯(二)--异常捕获处理

学更好的别人&#xff0c; 做更好的自己。 ——《微卡智享》 本文长度为1623字&#xff0c;预计阅读5分钟 前言 上一篇《Android Aidl跨进程通讯的简单使用》中介绍了跨进程的通讯处理&#xff0c;在进程间的数据通过Aidl实现了交互&#xff0c;项目中经常会遇到Bug&#xff0c…

charles证书失效解决方法

1. 先reset 2. 再下载&#xff08;即下载最新的证书&#xff09; 钥匙串中信任后即可正常使用

图像分割模型GUI应用:基于Tkinter和MMseg实现

简介 本篇博客介绍了一个使用Python的Tkinter库和MMseg图像分割库创建的图像分割模型GUI应用。该应用允许用户加载图像文件夹&#xff0c;浏览加载的图像&#xff0c;并对选定的图像执行分割推断&#xff0c;展示分割结果。这个应用演示了如何使用图形界面与深度学习模型结合&…

PageObject三层架构模式实现之数据驱动

接上一篇PageObject三层架构模式实现&#xff0c;发现我们的用户名和密码都是在代码中写死的&#xff0c;如果要测试不同用户名和密码的登录&#xff0c;那么每执行一次就要修改一次代码。这样效果非常不好。 因此本篇文章介绍如何实现数据驱动并且记录下每次操作的日志。 在…