PHP 文件系统完全指南

今天我们将开启一个新的探索之旅,深入了解 php 文件系统,系统地学习和掌握 php 文件系统的基本使用方法。

在日常的开发过程中,我们常常需要处理各种文件。例如,读取 .env 文件中的配置信息、将项目中的错误信息写入日志文件或者获取图片的创建时间等。在实现这些功能时,我们需要使用 PHP 文件系统接口。

以下是本文所涵盖主题的提纲:

一 什么是文件系统二 深入 PHP 文件系统三 面向对象的目录遍历四 PHP 文件系统思维导图

本文篇幅较长,阅读时间约为 20 分钟,请做好准备!

一 什么是文件系统

立即学习“PHP免费学习笔记(深入)”;

在开始之前,我们首先需要明确我们所研究的问题领域,理解什么是文件系统,以及我们所研究的对象。

简单来说,文件系统就是管理我们的目录(文件夹)和文件的方式。通常,我们会将具有相似属性的文件存储在同一个目录中,以便后续查找。这种常见的操作就会涉及到目录和文件的管理。

对于软件工程师来说,一个典型的使用场景是在开发 MVC 项目时,将控制器、视图和模型等模块的文件存储在不同的目录结构中以便管理。

无论如何,我们根据不同特性划分文件和目录都是为了解决文件存储和查找的问题。

有了这些认知后,我们自然会想到我们当前研究的 PHP 文件系统(或文件系统)的研究对象,简单来说就是:

目录(文件夹)文件

也就是说,本文所讲解的 PHP 文件系统函数处理,基本都是围绕目录和文件展开的。

二 深入 PHP 文件系统

在 PHP 文件系统中,内置提供了超过 80 个可用的文件系统函数。由于数量繁多且功能强大,本文无法逐一讲解所有系统函数。一方面,时间有限;另一方面,我们也没有足够的精力在短时间内掌握所有函数。

尽管如此,大家不必气馁,本文将利用有限的时间和精力,研究以下几个在文件处理时的常见话题:

文件的元数据如何获取文件的 MIME 类型如何获取文件和目录的操作文件和目录的权限管理

另外,补充说明一点,PHP 标准函数库不仅为我们提供了面向过程的文件系统处理函数,同时还封装了常用目录及文件操作的面向对象接口和迭代器接口,方便大家使用:

SplFileInfofinfoDirectoryIteratorRecursiveDirectoryIterator

2.1 文件系统的元数据

2.1.1 什么是元数据

元数据(meta data):通俗地说就是“数据的数据”。以一个 php 文件为例,它的元数据可以是创建时间、文件名、文件大小或文件所有权限等,这类能够表明该文件基本特征的数据就是“元数据(meta data)”。

2.1.2 常用元数据获取

在这一节,我们将学习一些经常需要获取的文件元数据函数,包括:

获取文件的最后修改时间获取文件的上次访问时间获取文件的路径信息获取文件的绝对路径获取文件类型获取文件大小获取文件权限获取文件所属用户及用户组

让我们开始吧!

获取文件的最后修改时间

要获取文件的上次被修改时间戳,我们可以使用函数 filemtime($filename) 或 SplFileInfo::getMTime() 方法。

// 文件路径请求改成你自己的文件路径$filename = "f://filesystem/test.txt";// 面向过程: 获取文件时间$modifyTimestamp = filemtime($filename);// 面向对象$file = new SplFileInfo($filename);$modifyTimestamp = $file->getMTime();

获取文件的上次访问时间

可以使用函数 fileatime($filename) 或 SplFileInfo::getATime() 方法,来获取文件的最后被访问时间戳。

// 文件路径请求改成你自己的文件路径$filename = "f://filesystem/test.txt";// 面向过程: 获取文件时间$accessTimestamp = fileatime($filename);// 面向对象$file = new SplFileInfo($filename);$accessTimestamp = $file->getATime();

除了 filemtime 和 fileatime 之外,还有 filectime 来获取文件的 inode 修改时间(可认为是创建时间)。

有关时间的函数常用的就这些,为了方便记住,我们来看看它们是如何命名的:

2.1 面向过程 file 前缀,面向对象 get 前缀2.2 a: access(访问);m:modify(修改);c:create(创建)2.3 time 后缀2.4 fileatime,SplFileInfo::getATime;filemtime,SplFileInfo::getMTime;filectime,SplFileInfo::getCTime。

是不是很简单呢!

3 获取文件的路径信息

除了时间这些元数据,另一个经常遇到的情况是获取文件的路径信息,包括:

3.1 目录信息

获取目录信息我们可以使用 pathinfo($filename, PATHINFO_DIRNAME)、dirname($filename) 和 SplFileInfo::getPath()。

比如下面给出的文件:

$filename = 'F:Program FilesSSH Communications SecuritySSH Secure ShellOutput.txt';

将会获取到 F:Program FilesSSH Communications SecuritySSH Secure Shell 这部分目录信息。

3.2 文件名信息

这里我们所有的文件名指的是不带扩展名后缀的文件名称,比如需要获取 your_path/filename.txt 中的 filename 部分。

需要取得文件名信息,我们可以使用 pathinfo($filename, PATHINFO_FILENAME)、basename($filename, $suffix) 和 SplFileInfo::getBasename($suffix) 获取。

这里给出的 $suffix 指不获取 $suffix 扩展名部分(比如不获取 $suffix = ‘.txt’)。

请看下面的示例:

$filename = 'F:Program FilesSSH Communications SecuritySSH Secure ShellOutput.txt';

将会获取到 Output 这部分文件名信息。

3.3 扩展名信息

扩展名我们可以使用 pathinfo($filename, PATHINFO_EXTENSION) 和 SplFileInfo::getExtension() 方法拿到。

基于前面的了解,我们可以获取到 txt 这部分扩展信息,这里不再赘述。

3.4 basename(文件名 + 扩展名)信息

basename 指的是 文件名 + 扩展名 内容信息,可以使用 pathinfo($filename, PATHINFO_BASENAME)、 basename($filename)、SplFileInfo::getBasename() 和 SplFileInfo::getFilename() 方法拿到。

虽然这里我们列出了很多的函数,但是基本上还是比较容易理解的,需要注意的是:

pathinfo 可以获取所有文件相关的路径信息,如果指定第二个参数选项将仅获取该部分的信息文件名和 basename 不是特别容易理解,你可以使用完全相同的方法或函数 basename 和 SplFileInfo::getBasename() 获取它们,区别在于是否摘除指定的 $suffix 后缀。

3.5 示例

getPath();echo '--- directory begin: ---' . PHP_EOL;echo $directory1 . PHP_EOL, $directory2 . PHP_EOL, $directory3 . PHP_EOL;// 文件名$suffix = '.txt';$filename1 = pathinfo($filename, PATHINFO_FILENAME);$filename2 = basename($filename, $suffix);$filename3 = $file->getBasename($suffix);echo '--- filename begin: ---' . PHP_EOL;echo $filename1 . PHP_EOL, $filename2 . PHP_EOL, $filename3 . PHP_EOL;// 扩展名$extension1 = pathinfo($filename, PATHINFO_EXTENSION);$extension2 = $file->getExtension();echo '--- extension begin: ---' . PHP_EOL;echo $extension1 . PHP_EOL, $extension2 . PHP_EOL;// basename = 文件名 + 扩展名$basename1 = pathinfo($filename, PATHINFO_BASENAME);$basename2 = basename($filename);$basename3 = $file->getBasename();$basename4 = $file->getFilename();echo '--- basename begin: ---' . PHP_EOL;echo $basename1 . PHP_EOL, $basename2 . PHP_EOL, $basename3 . PHP_EOL, $basename4 . PHP_EOL;

它们的运行结果如下:

--- directory begin: ---F:Program FilesSSH Communications SecuritySSH Secure ShellF:Program FilesSSH Communications SecuritySSH Secure ShellF:Program FilesSSH Communications SecuritySSH Secure Shell--- filename begin: ---OutputOutputOutput--- extension begin: ---txttxt--- basename begin: ---Output.txtOutput.txtOutput.txtOutput.txt

3.6 文件路径信息关系图

PHP 文件系统完全指南

4 获取文件的绝对路径

绝对路径由 realpath($path) 和 SplFileInfo::getRealpath() 获取。

5 获取文件类型

可以使用 filetype($filename) 和 SplFileInfo::getType() 来获取文件的类型。

小文AI论文 小文AI论文

轻松解决论文写作难题,AI论文助您一键完成,仅需一杯咖啡时间,即可轻松问鼎学术高峰!

小文AI论文 69 查看详情 小文AI论文

返回值范围:

dirfilecharfifoblocklinkunknown

可以查看 Linux 文件类型与扩展名 相关文件类型,这里我们重点关注下 dir 目录和 file 普通文件类型即可。

6 获取文件大小

可以使用 filesize($filename) 和 SplFileInfo::getSize() 来获取文件的大小,不再赘述。

7 获取文件权限

可以使用 fileperms($filename) 和 SplFileInfo::getPerms() 来获取到文件的所属权限。

值得注意的是它们的返回值是十进制表示的权限,如果需要获取类似 0655 八进制权限表示法,我们需要对返回值进行处理才行:

// @see  http://php.net/manual/zh/function.fileperms.php#refsect1-function.fileperms-examples$permissions = substr(sprintf("%o", fileperms($filename)), -4);

你可以通过 PHP: fileperms() values and convert these 了解更多关于 PHP 获取文件权限转换的更多细节。

基本上学习完这些文件元数据信息获取方法,差不多可以应对日常开发过程中的多数应用场景,尽管如此,还是建议仔细去阅读官方 文件系统函数,那里才是知识的源泉。

掌握文件的元数据,对我们了解文件的特性大有裨益,就好比两个人谈恋爱,懂得彼此才是最好的状态。

2.2 文件系统操作

可以说我们日常在处理文件的过程中,更多的是在操作文件或者目录(文件夹),本节我们将学习文件系统操作相关知识。

依据文件类型的不同我们可以简单的将操作分为:

对目录(dir)的操作对普通文件(file)的操作

2.2.1 目录操作

使用场景

在处理目录时我们一般涉及如下处理:

创建目录删除目录打开目录读取目录关闭目录句柄

场景一

我们有一套 CMS 管理系统支持文件上传处理,当目录不存在时依据文件上传时间,动态的创建文件存储目录,比如,我们依据 年/月/日(2018/01/01) 格式创建目录。这里就涉及到 目录创建 的处理。

场景二

当然,文件上传完成了还不够,我们还需要读取各个目录下的所有文件。这里涉及 打开目录、读取目录 以及读取完成后 关闭目录句柄。

有了相关概念和思路后,我们具体看看究竟 PHP 文件系统给我们提供了哪些方便处理目录的函数呢?

2.2.1.1 创建目录

在 PHP 文件系统扩展中同样给我们提供了处理 目录结构的系统函数。

其中创建一个新目录需要使用 mkdir($pathname [, $mode = 0777, $recursive = false]) 函数。

$pathname 参数为待创建目录的路径$mode 为创建目录时的访问权限,0777 意味着获取最大访问权限$recursive 用于标识是否递归创建目录,默认 false 不会递归创建

请看一个示例:

$pathname = "/path/to/your/upload/file/2018/01/01";$created = mkdir($pathname);

创建目录是不是特别的简单呢?

但是等等,我们在类 Unix 系统中满心欢喜的使用 mkdir 并采用 $mode=0777 权限来创建一个全新的目录,但为什么当我们进入到目录中看到的目录的权限却是 0755 呢?

umask 掩码

这里涉及到 umask 掩码的问题!

重点: 原来我们在类 Unix 系统中创建新目录是给出的权限会默认减去当前系统的 umask 值,才是实际创建目录时的所属权限。

什么意思呢?

比如:

// 我们期望创建的文件权限$mode = 0777;// 当前系统中 umask 值$umask = 0022;// 可以由 umask 命令查看当前系统 umask 值,默认是 0022// 实际创建的文件权限  0777 - 0022 = 0755

现在我们来对之前的实例稍作修改,看看 PHP 如何创建目录时得到希望的系统权限吧:

$pathname = "/path/to/your/upload/file/2018/01/01";// 将系统 umask 设置为 0,并取得当前 umask 值(比如默认 0022)$umask = umask(0);$created = mkdir($pathname, $mode = 0777);// 将系统 umask 设置回原值umask($umask);

有关 umask 函数说明可以查看官方手册。另外可以查看 Why can’t PHP create a directory with 777 permissions? 这个问答了解更多细节。

2.2.1.2 目录遍历

面向过程的目录遍历提供两种解决方案:

通过 opendir、readdir 和 closedir 来遍历目录;另一种是直接使用 scandir 遍历指定路径中的文件和目录。

目录遍历示例一,出自 官方文档:


目录遍历示例二,出自 官方文档:

 .//     [1] => ..//     [2] => bar.php//     [3] => foo.txt//     [4] => somedir// )

目录的操作处理大致就是在处理这两类问题,相比于普通文件的处理来讲简单很多,下一节我们会学习有关普通文件的处理,请大家做好战斗准备。

2.2.2 文件操作

使用场景

可以说我们在处理文件系统时,绝大多数都是在处理一个普通文件,那么我们在操作文件时,我们究竟在做什么呢?

你可能已经想到了,没错我们多数时候就是在处理如下文件问题:

创建一个新的空文件打开一个文件句柄,以供后续读取或写入将文件中的内容覆盖掉(覆盖写入),或者在文件末尾写入新的内容(追加写入)读取文件的内容删除文件复制文件关闭文件句柄

文件的读取和写入相对会复杂一些,所以这两部分的内容会在稍后详细讲解。先让我们看看其它几个常见文件处理。

2.2.2.1 创建空文件

创建空文件有两种方式: 一是:以写入(w)模式使用 fopen($filename, $mode = ‘wb’) 打开一个文件,当文件不存在时则会创建一个新文件; 二是:使用 touch 函数创建一个新文件。

这两个函数同其它文件系统函数使用大致相同,感兴趣的朋友可以阅读手册,这里不作展开。

2.2.2.2 删除文件

删除文件由 unlink($filename) 函数完成。

2.2.2.3 复制文件

复制文件由 copy($source, $dest) 函数完成,会将 $source 文件拷贝到 $dest 文件中。

如果需要移动文件(重命名)可以使用 rename($oldname, $newname) 完成这个处理。

以上就是PHP 文件系统完全指南的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/514202.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
英雄无敌3死亡阴影怎么窗口化?-英雄无敌3死亡阴影窗口化的方法
上一篇 2025年11月9日 02:21:53
Debian如何回收无用的系统服务
下一篇 2025年11月9日 02:21:56

相关推荐

  • WooCommerce 购物车联动:实现赠品自动添加与移除的专业指南

    本文提供了一份关于在 woocommerce 中实现自动赠品系统的全面指南。它解决了在程序化添加产品时常见的 `woocommerce_add_to_cart` 递归问题,并提供了一个使用自定义购物车项元数据来管理关联赠品的健壮解决方案,确保赠品能与特定主产品同步添加和移除。 引言 在电子商务中,为…

    2026年9月23日
    400
  • Java Web项目在无Maven/Eclipse环境下生成WAR包的实践指南

    本文详细介绍了如何在没有Maven或Eclipse等集成开发环境或构建工具的情况下,为Java Web项目手动或通过Apache Ant工具生成WAR文件。教程涵盖了WAR文件的基本结构、使用Ant进行编译和打包的具体步骤,并提供了Ant构建脚本示例,旨在帮助开发者理解并实践WAR包的独立构建过程。…

    2026年9月23日
    000
  • MySQL安装需要哪些硬件配置要求?

    MySQL安装需要哪些硬件配置要求?MySQL安装需要哪些硬件配置要求?MySQL安装需要哪些硬件配置要求?MySQL安装需要哪些硬件配置要求?

    mysql的硬件配置需根据应用场景和负载决定,生产环境应重点考虑磁盘i/o、内存、cpu和网络。1. cpu:oltp场景多核心更重要,olap则更依赖主频和缓存;2. 内存:buffer pool越大越好,但需避免过度分配导致swap使用;3. 磁盘i/o:ssd是标配,nvme ssd和raid…

    2026年9月23日 用户投稿
    200
  • PHP教程:解析和访问包含JSON字符串的数组值

    本教程旨在指导读者如何高效地从PHP数组中提取数据,特别是当数组的每个元素都是一个JSON格式的字符串时。文章将详细介绍如何利用json_decode()函数将JSON字符串转换为PHP数组,并通过示例代码演示循环遍历和直接访问特定字段的方法,帮助您轻松处理此类复杂数据结构。 理解数据结构 在php…

    2026年9月23日
    000
  • 视频号新号直播扶持几天?视频号怎么做才有流量

    近年来,随着视频号平台的不断壮大,越来越多的人开始将目光投向这一新兴领域。为了吸引优质创作者加入,视频号推出了针对新注册账号的直播扶持计划。本文将带您深入了解这项扶持政策,并提供实用建议,帮助您快速提升影响力。 一、视频号直播扶持政策详解 1. 政策背景 该扶持政策是视频号顺应国家推动数字经济发展、…

    2026年9月23日
    300
  • chrome浏览器最新官方网址下载 chrome浏览器官网链接快速直达

    Chrome浏览器最新官方下载网址是https://www.google.cn/chrome/,提供安卓版和手机版下载,界面简洁,支持书签同步、网页翻译、点按搜索等功能,确保快速安全的浏览体验。 chrome浏览器最新官方网址下载在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来chrome…

    2026年9月23日
    200
  • VSCode极速配置Scala:sbt支持、中文文档、REPL集成

    安装JDK和sbt后,在VSCode中安装Metals扩展,即可快速搭建Scala开发环境;2. Metals通过LSP和BSP协议实现代码补全、错误检查、重构及sbt项目自动导入;3. 支持通过sbt shell启动REPL或使用Run Worksheet实现交互式编程;4. 虽无内置中文文档,但…

    2026年9月23日
    100
  • 优麒麟 25.10 版本正式发布

    优麒麟 25.10 正式版现已上线,此版本将提供长达9个月的支持周期,基于最新的 linux 6.17 内核打造,在基础库、子系统及核心组件等方面实现了全面升级,显著提升了系统的稳定性与兼容性,同时推出了焕然一新的软件商店。 新增特性 1. 搭载 Linux 6.17 内核 优麒麟 25.10 集成…

    2026年9月23日
    100
  • linux如何优雅的关机

    优雅关机的三大法宝:拔电源、shutdown、poweroff 及其对硬件和数据的影响 在讨论关机方法之前,先了解一下机械硬盘的内部结构。 那固态硬盘SSD呢? FTL工作示意图。FTL表对SSD至关重要,如果在FTL写回Flash之前突然断电,内存数据丢失,FTL表也将丢失。因此,高端SSD和服务…

    2026年9月23日
    100
  • PHP自定义函数:创建与使用 prev_id() 函数的实践指南

    本文旨在指导读者如何定义和实现自定义PHP函数,以解决“Call to undefined function”错误。通过 prev_id() 函数的创建示例,详细阐述了函数的基本语法、参数传递、返回值以及在实际应用(如数据库查询)中的集成方法,并提供了关键注意事项,帮助开发者编写模块化、可维护的代码…

    2026年9月23日
    000
  • 四种获取fasta序列长度的方法

    在处理fasta序列时,我们常常需要知道每条序列的长度。今天小编将与大家分享四种获取fasta序列长度的方法。 一、使用awk 以下是使用awk获取fasta序列长度的代码: awk ‘/^>/{if (l!=””) print l; print; l=0; next}{l+=length($…

    2026年9月23日
    200
  • VSCode如何实现代码版本对比 VSCode Git差异对比的高效使用方法

    vscode通过scm视图直接对比工作区与head的差异;2. 点击已暂存文件可查看暂存区与head的差异;3. 通过命令面板、scm历史记录或右键菜单可对比任意版本或文件;4. 差异视图支持并排和内联模式,并提供跳转导航;5. 时间线视图可追溯文件级提交历史并对比各版本;6. gitlens扩展增…

    2026年9月23日
    600
  • 快手极速版官方网页版地址_快手极速版App下载官网首页

    快手极速版官方网页版地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来快手极速版官方网页版地址及App下载相关信息,感兴趣的网友一起随小编来瞧瞧吧! https://www.kuaishou.com/ 1、小步骤内容。进入官网后可直接浏览平台首页推荐内容,涵盖生活记录、才艺展示等多个领域…

    2026年9月23日
    300
  • Flink项目实践 | Flink 单机安装部署

    Flink项目实践 | Flink 单机安装部署Flink项目实践 | Flink 单机安装部署Flink项目实践 | Flink 单机安装部署Flink项目实践 | Flink 单机安装部署

    apache flink 是一个用于对无界和有界数据流进行状态计算的框架和分布式处理引擎。flink 设计旨在所有常见集群环境中运行,并以内存速度和任意规模进行计算。 为了深入了解 Flink,首先需要搭建其运行环境。 Flink 可以在所有类似 UNIX 的环境中运行,包括 Linux,Mac O…

    2026年9月23日 用户投稿
    200
  • Windows系统安装MySQL的完整步骤是什么?

    Windows系统安装MySQL的完整步骤是什么?Windows系统安装MySQL的完整步骤是什么?Windows系统安装MySQL的完整步骤是什么?Windows系统安装MySQL的完整步骤是什么?

    安装#%#$#%@%@%$#%$#%#%#$%@_81c++3b080dad537de7e10e0987a4bf52e前需准备系统兼容性、硬件资源、前置运行时库、管理员权限及排查端口冲突。1. 系统兼容性:确保使用windows 10/11或对应server版本;2. 硬件资源:建议至少4gb内存;…

    2026年9月23日 用户投稿
    200
  • 优化 Laravel Nova 长耗时操作的响应消息持久化显示

    本文旨在解决 Laravel Nova 中耗时操作(如数分钟)的响应消息(Toast)短暂显示问题。针对默认 Action::message() 无法提供持久化反馈的局限性,我们将深入探讨如何利用 Laravel Nova 4 的通知功能,实现更持久、可交互且用户友好的操作完成提示,确保用户不会错过…

    2026年9月23日
    100
  • PHP三元运算符和if如何选_PHP三元运算符与if选择指南

    三元运算符适用于简单赋值或返回值,如条件赋值、模板输出;if语句适合复杂逻辑、多分支或多操作场景。性能差异可忽略,应优先考虑可读性和维护性。两者可结合使用,分工明确更清晰。 在PHP开发中,三元运算符和if语句都能实现条件判断,但它们适用的场景不同。选择合适的方式能让代码更清晰、易维护。关键不是“哪…

    2026年9月23日
    100
  • mysql怎么添加哈希索引 mysql创建哈希索引的使用场景

    mysql怎么添加哈希索引 mysql创建哈希索引的使用场景mysql怎么添加哈希索引 mysql创建哈希索引的使用场景mysql怎么添加哈希索引 mysql创建哈希索引的使用场景mysql怎么添加哈希索引 mysql创建哈希索引的使用场景

    mysql中可以显式添加哈希索引的场景仅限于memory存储引擎,1.创建memory表时通过using hash语法指定主键或辅助索引;2.对已有memory表使用alter table添加哈希索引。对于innodb等磁盘引擎,无法手动创建哈希索引,但其内部会自动管理自适应哈希索引(ahi)以优化…

    2026年9月23日 用户投稿
    200
  • VSCode配置MacOS C环境 详细图解VSCode搭建C++开发

    在mac++os上用vscode配置c/c++环境的关键是安装xcode command line tools以获取clang编译器和lldb调试器,然后安装vscode的c/c++扩展,接着创建项目文件夹和源文件,通过配置tasks.json定义编译任务,确保使用clang编译当前文件并生成可执行…

    2026年9月23日
    100
  • 荣耀X系列微信收款语音播报如何设置?教你快速配置支付提示

    设置微信收款语音播报需先开启微信内“收款到账语音提醒”开关,再检查荣耀手机系统通知权限及音量设置。2. 若无语音提示,应排查微信开关、系统通知、勿扰模式、音量大小及后台运行权限。3. 支付宝等其他App设置逻辑相同,均需应用内开启语音播报并确保系统通知权限开启。4. 语音音量由手机媒体或通知音量控制…

    2026年9月23日
    100

发表回复

登录后才能评论
关注微信