0

0

PHP 文件系统完全指南

星夢妙者

星夢妙者

发布时间:2025-05-07 08:06:01

|

1278人浏览过

|

来源于php中文网

原创

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

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

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

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

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

一 什么是文件系统

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

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

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

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

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

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

目录(文件夹) 文件

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

二 深入 PHP 文件系统

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

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

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

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

SplFileInfo finfo DirectoryIterator RecursiveDirectoryIterator

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 Files\SSH Communications Security\SSH Secure Shell\Output.txt';

将会获取到 F:\Program Files\SSH Communications Security\SSH 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 Files\SSH Communications Security\SSH Secure Shell\Output.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 Files\SSH Communications Security\SSH Secure Shell
F:\Program Files\SSH Communications Security\SSH Secure Shell
F:\Program Files\SSH Communications Security\SSH Secure Shell
--- filename begin: ---
Output
Output
Output
--- extension begin: ---
txt
txt
--- basename begin: ---
Output.txt
Output.txt
Output.txt
Output.txt

3.6 文件路径信息关系图

PHP 文件系统完全指南

4 获取文件的绝对路径

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

5 获取文件类型

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

DBShop开源商城系统
DBShop开源商城系统

DBShop开源商城系统,使用PHP语言基于Laminas(Zendframework 3) + Doctrine 2 组合框架开发完成。可定制、多终端、多场景、多支付、多货币;严谨的安全机制,可靠稳定;方便的操作管理,节约时间;清晰的权限分配,责任分明;便捷的更新处理,一键搞定;丰富的插件市场,扩展无限。

下载

返回值范围:

dir file char fifo block link unknown

可以查看 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速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2017

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1334

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1241

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

948

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1402

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1231

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1440

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1303

2023.11.13

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.2万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号