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

【PHP】文件操作

文章目录

  • 文件编程的必要性
  • 目录操作
  • 其它目录操作
  • 递归遍历目录
  • 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>";
}

相关文章:

【PHP】文件操作

文章目录 文件编程的必要性目录操作其它目录操作递归遍历目录PHP5常见文件操作函数PHP4常见文件操作函数其他文件操作函数 文件编程的必要性 文件编程指利用PHP代码针对文件&#xff08;文件夹&#xff09;进行增删改查操作。 在实际开发项目中&#xff0c;会有很多内容&…...

科创板50ETF期权交易:详细规则、费用、保证金和开户攻略

科创板50ETF期权是指以科创板50ETF为标的资产的期权合约。科创板50ETF是由交易所推出的一种交易型开放式指数基金&#xff08;ETF&#xff09;&#xff0c;旨在跟踪科创板50指数的表现&#xff0c;下文介绍科创板50ETF期权交易&#xff1a;详细规则、费用、保证金和开户攻略&am…...

怎么把图片放大并且清晰?有详细的方法步骤

怎么把图片放大并且清晰&#xff1f;数字图像处理中的图片放大是许多行业和领域中广泛应用的一项技术。常规的放大方法通过插值或复制像素的方式增加像素数&#xff0c;但这会导致失真和模糊。无损放大是一种特殊的放大方法&#xff0c;它可以通过数学算法来增加图片的尺寸&…...

C++ 构造函数、析构函数调用虚函数

C虚函数是通过虚表实现的&#xff0c;虚函数的地址记录在需表中&#xff0c;只对象完成构造完成后&#xff0c;虚函数的地址才最终确定。 构造函数中调用虚函数 基类先于派生类构造&#xff0c;所以构造时没法调用到派生类的虚函数&#xff0c;也就是说只能调用到自己&#x…...

工业状态监测如何选择合适的无线技术?

工业领域的状态监测在提高生产效率和产品质量方面起着关键作用。过去依赖于预防性维护和例行检查的方式已经不再能满足日益复杂的生产需求&#xff0c;随着工业物联网&#xff08;IIoT&#xff09;的兴起&#xff0c;设备状态监测逐渐成为一种关键策略&#xff0c;催生了预测性…...

Mysql45讲学习笔记

前言&#xff1a;这篇文章主要总结事务&#xff0c;锁、索引的一些知识点&#xff0c;然后分享一下自己学习小心得&#xff0c;我会从点到线在到面展开说说&#xff0c;对于学习任何知识&#xff0c;我们都应该藐其全貌&#xff0c;不要一开始就选入细节 基础 一、基础架构&a…...

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

报错描述 情景一 1Panel在"主机-->进程守护"通过命令"nohup /opt/tomcat/bin/startup.sh > /opt/supersivor/tomcat/nohup.log &"创建守护进程&#xff0c;运行日志如下&#xff1a; #--------------------------------------------------------…...

opencv 水果识别+UI界面识别系统,可训练自定义的水果数据集

目录 一、实现和完整UI视频效果展示 主界面&#xff1a; 测试图片结果界面&#xff1a; 自定义图片结果界面&#xff1a; 二、原理介绍&#xff1a; 图像预处理 HOG特征提取算法 数据准备 SVM支持向量机算法 预测和评估 完整演示视频&#xff1a; 完整代码链接 一、…...

TypeScript数组和对象的操作

TypeScript数组和对象的操作 一、数组的声明二、数组初始化三、数组元素赋值、添加、更改四、删除五、合并、断开数组六、查找数组元素七、连接数组元素八、排序、反序数组九、遍历数组&#xff0c;对象 一、数组的声明 let arr1: Array<number>; let arr2: number[];二…...

docker之Compose与DockerSwarm

目录 Compose 简介 概念 为什么需要&#xff1f; 配置字段 常用命令 安装 1.下载 2.授权 使用 1.创建文件 2.启动 docker Swarm 关键概念 调度策略 spread binpack random 特性 集群部署 1.准备 2.创建swarm并添加节点 在主服务器上创建swarm集群 节点…...

VS Code 使用 clang++ 编译,使用 cppvsdbg 或 lldb 调试的配置方法

需要安装的 VS Code LLVM VS Code 需要安装的插件&#xff1a; C/C&#xff08;用来配置 c_cpp_properties.json&#xff09; CodeLLDB&#xff08;如果你要用 lldb 调试&#xff0c;那么这个插件就需要安装&#xff0c;用来连接到 lldb 调试器&#xff09; 流程 我们都…...

android11,12 Launcher3编译什么

1首先看看手机里的是什么 adb shell pm path com.android.launcher3 package:/system_ext/priv-app/Launcher3QuickStep/Launcher3QuickStep.apk 然后就编译Launcher3QuickStep 2push apk 没什么说的&#xff0c;push到对应的文件夹 /system_ext/priv-app/Launcher3Quick…...

Go 第三方库引起的线上问题、如何在线线上环境进行调试定位问题以及golang开发中各种问题精华整理总结

Go 第三方库引起的线上问题、如何在线线上环境进行调试定位问题以及golang开发中各种问题精华整理总结。 01 前言 在使用 Go 语言进行 Web 开发时&#xff0c;我们往往会选择一些优秀的库来简化 HTTP 请求的处理。其中&#xff0c;go-resty 是一个被广泛使用的 HTTP 客户端。…...

【C语言】#define 宏定义初步使用

使用宏定义可以防止出错&#xff0c;提高可移植性&#xff0c;可读性&#xff0c;方便性等。 下面列举了一些成熟软件中常用的宏定义。 重新定义一些基本类型 重新定义一些类型&#xff0c;防止由于各种平台和编译器的不同&#xff0c;而产生的类型字节数差异&#xff0c;方便…...

项目里面怎么解决跨域的?

一.前端配置跨域 proxy解决跨域 在vue.config.js中通过proxy devServer中配置反向代理。 devServer: {port: port,open: true,overlay: {warnings: false,errors: true},// 配置反向代理proxy: {// 当地址中有/api的时候会触发代理机制/api: {target: http://ihrm-java.ithe…...

Oracle 批量导出表注释和主键

–查询分表&#xff08;目前分了16张表&#xff09; –先查询注释为空的表&#xff0c;也就是11表做示例&#xff0c;统计出来以后11批量修改成1 select owner,column_name,comments,table_name from all_col_comments a where a.table_name like ‘TB%1’ and a.comments is n…...

Linux C++ 海康摄像头获取过车信息

代码 void CALLBACK MessageCallback(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void *pUser) {printf("enter MessageCallback---------------------->\n");int i;NET_DVR_ALARMINFO_V30 struAlarmInfo;memcpy(&struAl…...

iOS逆向:越狱及相关概念的介绍

在上一篇内容中我们介绍了App脱壳的技术&#xff0c;今天我们来介绍一个和iOS逆向密切相关的知识&#xff1a;越狱。 iOS操作系统的封闭性一直是开发者们关注的焦点之一。为了突破Apple的限制&#xff0c;越狱技术应运而生。本文将深入探讨iOS越狱&#xff0c;包括可越狱的版本…...

SQL语法与DDL语句的使用

文章目录 前言一、SQL通用语法二、DDL语句1、DDL功能介绍2、DDL语句对数据库操作&#xff08;1&#xff09;查询所有数据库&#xff08;2&#xff09;查询当前数据库&#xff08;3&#xff09;创建数据库&#xff08;4&#xff09;删除数据库&#xff08;5&#xff09;切换数据…...

Node.js /webpack DAY6

一、Node.js 入门 1. 什么是 Node.js&#xff1f; 2. 什么是前端工程化&#xff1f; 3. Node.js 为何能执行 JS&#xff1f; 4. Node.js 安装 5. 使用 Node.js 总结 6. fs 模块 - 读写文件 /*** 目标&#xff1a;基于 fs 模块 读写文件内容* 1. 加载 fs 模块对象* 2. 写入文件…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...