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

深入浅出:PHP 文件操作

文章目录

    • 引言
    • 文件的基本操作
      • 打开文件
      • 读取文件
        • 逐行读取
        • 读取整个文件
      • 写入文件
        • 追加写入
        • 覆盖写入
      • 关闭文件
    • 文件和目录的管理
      • 检查文件或目录是否存在
      • 创建和删除文件
      • 创建和删除目录
      • 复制和移动文件
    • 处理文件权限
      • 设置文件权限
      • 获取文件权限
    • 处理文件属性
      • 获取文件大小
      • 获取文件最后修改时间
    • 使用 SPL 进行文件操作
      • DirectoryIterator 类
      • FilesystemIterator 类
    • 综合案例
    • 参考资料

引言

在开发Web应用时,文件系统操作是不可或缺的一部分。无论是上传用户文件、记录日志,还是读取配置文件,PHP 提供了丰富的内置函数和类来帮助我们高效地管理文件和目录。本文将深入探讨 PHP 中的文件系统操作,帮助你掌握如何轻松处理文件和目录。

文件的基本操作

打开文件

在 PHP 中,使用 fopen() 函数可以打开一个文件。fopen() 返回一个文件指针,用于后续的读写操作。常见的模式包括:

  • r:只读模式,文件必须存在。
  • w:写入模式,如果文件存在则清空内容,如果不存在则创建新文件。
  • a:追加模式,如果文件存在则在末尾追加内容,如果不存在则创建新文件。
  • r+:读写模式,文件必须存在。
  • w+:读写模式,如果文件存在则清空内容,如果不存在则创建新文件。
  • a+:读写模式,如果文件存在则在末尾追加内容,如果不存在则创建新文件。
<?php
$file = fopen("example.txt", "r");
if ($file) {echo "File opened successfully.";
} else {echo "Failed to open file.";
}
?>

这段代码尝试以只读模式打开 example.txt 文件,并输出相应的结果。

读取文件

逐行读取

使用 fgets() 函数可以逐行读取文件内容。这在处理大文件时非常有用,因为它不会一次性将整个文件加载到内存中。

<?php
$file = fopen("example.txt", "r");
if ($file) {while (($line = fgets($file)) !== false) {echo $line . "\n";}fclose($file);
} else {echo "Failed to open file.";
}
?>

这段代码会逐行读取 example.txt 文件的内容并输出每一行。

读取整个文件

如果你需要一次性读取整个文件的内容,可以使用 file_get_contents() 函数。它会返回文件的全部内容作为字符串。

<?php
$content = file_get_contents("example.txt");
if ($content !== false) {echo $content;
} else {echo "Failed to read file.";
}
?>

这段代码会读取 example.txt 文件的全部内容并输出。

写入文件

追加写入

使用 fopen() 函数以追加模式 (a) 打开文件,然后使用 fwrite()fputs() 函数写入内容。这样可以在文件末尾添加新的内容,而不会覆盖原有内容。

<?php
$file = fopen("example.txt", "a");
if ($file) {fwrite($file, "This is a new line.\n");fclose($file);echo "Content appended successfully.";
} else {echo "Failed to open file.";
}
?>

这段代码会在 example.txt 文件末尾追加一行新内容。

覆盖写入

使用 fopen() 函数以写入模式 (w) 打开文件,然后使用 fwrite()fputs() 函数写入内容。这样会清空文件的原有内容,并用新内容替换。

<?php
$file = fopen("example.txt", "w");
if ($file) {fwrite($file, "This is the new content.\n");fclose($file);echo "Content written successfully.";
} else {echo "Failed to open file.";
}
?>

这段代码会覆盖 example.txt 文件的原有内容,写入新的内容。

关闭文件

使用 fclose() 函数可以关闭文件指针。关闭文件是非常重要的,因为它释放了文件资源,确保数据正确保存。

<?php
$file = fopen("example.txt", "r");
if ($file) {// 读取或写入文件的操作fclose($file);echo "File closed successfully.";
} else {echo "Failed to open file.";
}
?>

这段代码在完成文件操作后关闭了文件指针。

文件和目录的管理

检查文件或目录是否存在

使用 file_exists() 函数可以检查文件或目录是否存在。这对于避免不必要的错误非常重要。

<?php
$filename = "example.txt";
if (file_exists($filename)) {echo "File exists.";
} else {echo "File does not exist.";
}
?>

这段代码会检查 example.txt 文件是否存在,并输出相应的结果。

创建和删除文件

使用 touch() 函数可以创建一个空文件,或者更新现有文件的时间戳。使用 unlink() 函数可以删除文件。

<?php
$filename = "newfile.txt";// 创建文件
if (touch($filename)) {echo "File created successfully.";
} else {echo "Failed to create file.";
}// 删除文件
if (unlink($filename)) {echo "File deleted successfully.";
} else {echo "Failed to delete file.";
}
?>

这段代码会创建一个名为 newfile.txt 的文件,然后删除它。

创建和删除目录

使用 mkdir() 函数可以创建目录,使用 rmdir() 函数可以删除空目录。如果要删除非空目录,可以使用递归方法或第三方库(如 RecursiveDirectoryIterator)。

<?php
$dirname = "newdir";// 创建目录
if (mkdir($dirname)) {echo "Directory created successfully.";
} else {echo "Failed to create directory.";
}// 删除目录
if (rmdir($dirname)) {echo "Directory deleted successfully.";
} else {echo "Failed to delete directory.";
}
?>

这段代码会创建一个名为 newdir 的目录,然后删除它。

复制和移动文件

使用 copy() 函数可以复制文件,使用 rename() 函数可以移动或重命名文件。

<?php
$source = "example.txt";
$destination = "copied_example.txt";// 复制文件
if (copy($source, $destination)) {echo "File copied successfully.";
} else {echo "Failed to copy file.";
}// 移动文件
if (rename($destination, "moved_example.txt")) {echo "File moved successfully.";
} else {echo "Failed to move file.";
}
?>

这段代码会复制 example.txt 文件为 copied_example.txt,然后将其重命名为 moved_example.txt

处理文件权限

设置文件权限

使用 chmod() 函数可以设置文件的权限。权限值通常以八进制表示,例如 0644 表示所有者可读写,其他用户只读。

<?php
$filename = "example.txt";
if (chmod($filename, 0644)) {echo "Permissions set successfully.";
} else {echo "Failed to set permissions.";
}
?>

这段代码会将 example.txt 文件的权限设置为 0644

获取文件权限

使用 fileperms() 函数可以获取文件的权限信息。返回值是一个整数,可以通过位运算符解析具体的权限。

<?php
$filename = "example.txt";
$permissions = fileperms($filename);echo "File permissions: " . decoct($permissions & 0777) . "\n";
?>

这段代码会输出 example.txt 文件的权限,格式化为八进制表示。

处理文件属性

获取文件大小

使用 filesize() 函数可以获取文件的大小,单位为字节。

<?php
$filename = "example.txt";
$size = filesize($filename);echo "File size: " . $size . " bytes\n";
?>

这段代码会输出 example.txt 文件的大小。

获取文件最后修改时间

使用 filemtime() 函数可以获取文件的最后修改时间,返回值是一个 Unix 时间戳。

<?php
$filename = "example.txt";
$last_modified = filemtime($filename);echo "Last modified: " . date("Y-m-d H:i:s", $last_modified) . "\n";
?>

这段代码会输出 example.txt 文件的最后修改时间。

使用 SPL 进行文件操作

PHP 提供了标准库(SPL)中的多个类来简化文件和目录的操作。以下是两个常用的类:

DirectoryIterator 类

DirectoryIterator 类用于遍历目录中的文件和子目录。它提供了简单的方法来访问每个条目。

<?php
$dir = new DirectoryIterator(".");foreach ($dir as $file) {if ($file->isFile()) {echo "File: " . $file->getFilename() . "\n";} elseif ($file->isDir() && !$file->isDot()) {echo "Directory: " . $file->getFilename() . "\n";}
}
?>

这段代码会遍历当前目录中的所有文件和子目录,并分别输出文件和目录的名称。

FilesystemIterator 类

FilesystemIterator 类是 DirectoryIterator 的扩展,提供了更多的选项来控制遍历行为。例如,你可以选择是否忽略点文件(...)。

<?php
$dir = new FilesystemIterator(".", FilesystemIterator::SKIP_DOTS);foreach ($dir as $file) {echo "Entry: " . $file->getFilename() . "\n";
}
?>

这段代码会遍历当前目录中的所有条目,并忽略点文件。

综合案例

让我们通过一个更复杂的例子来巩固所学的知识。假设我们要编写一个程序,该程序接收用户输入的文件名,检查文件是否存在,如果存在则读取文件内容并显示;如果不存在则提示用户创建新文件并写入初始内容。

<?php
function handleFile($filename) {if (file_exists($filename)) {echo "File exists. Reading content:\n";$content = file_get_contents($filename);if ($content !== false) {echo $content;} else {echo "Failed to read file.";}} else {echo "File does not exist. Creating new file and writing initial content.\n";$file = fopen($filename, "w");if ($file) {fwrite($file, "This is the initial content of the file.\n");fclose($file);echo "File created and initial content written successfully.";} else {echo "Failed to create file.";}}
}// 获取用户输入
$user_filename = readline("Please enter the filename: ");// 处理文件
handleFile($user_filename);
?>

这段代码展示了如何结合文件操作函数来处理用户输入,并根据不同的情况作出响应。

参考资料

  • PHP 官方文档 - Filesystem Functions
  • W3Schools - PHP Filesystem
  • Real PHP - Working with Files in PHP
  • PHP The Right Way - Filesystem
  • PHP SPL Documentation

欢迎在评论区互动,彼此交流相互学习! 😊

相关文章:

深入浅出:PHP 文件操作

文章目录 引言文件的基本操作打开文件读取文件逐行读取读取整个文件 写入文件追加写入覆盖写入 关闭文件 文件和目录的管理检查文件或目录是否存在创建和删除文件创建和删除目录复制和移动文件 处理文件权限设置文件权限获取文件权限 处理文件属性获取文件大小获取文件最后修改…...

116. UE5 GAS RPG 实现击杀掉落战利品功能

这一篇&#xff0c;我们实现敌人被击败后&#xff0c;掉落战利品的功能。首先&#xff0c;我们将创建一个新的结构体&#xff0c;用于定义掉落体的内容&#xff0c;方便我们设置掉落物。然后&#xff0c;我们实现敌人死亡时的掉落函数&#xff0c;并在蓝图里实现对应的逻辑&…...

【批处理脚本】更改Windows系统中的 hosts 解析文件

概述 作用 修改 Windows 系统中的 hosts 文件&#xff0c;可以实现 插入 或 删除 条目。该脚本允许用户以管理员权限执行&#xff0c;将特定的域名解析到指定的 IP 地址 应用场景 非常适用于需要频繁或批量修改 hosts 文件的场景&#xff1a; 屏蔽网站、域名重定向、DNS 污染防…...

fastDFS

docker 部署fastDFS docker pull delron/fastdfs docker-compose.yml version: 3services:fastdfs_tracker:image: delron/fastdfs:latestcontainer_name: trackerhostname: trackernetwork_mode: hostports:- "22122:22122"volumes:- ./data/tracker:/var/fdfsco…...

【Linux】存储

声明&#xff1a;以下内容均来学习自《Linux就该这么学》一书 Linux系统中的一切文件都是从“根(/)”目录开始的&#xff0c;并按照文件系统层次化标准&#xff08;FHS&#xff09;采用树形结构来存放文件&#xff0c;以及定义了常见目录的用途。此外&#xff0c;Linux系统中的…...

hadoop单机安装

步骤 1:安装 Java 安装 OpenJDK bash sudo yum install -y java-1.8.0-openjdk 验证 Java 安装 bash java -version 输出类似以下内容表示成功: arduino openjdk version “1.8.0_xxx” 步骤 2:下载 Hadoop 下载 Hadoop 安装包 前往 Hadoop 官方下载页面,获取最新稳…...

产品批量分类设置——未来之窗行业应用跨平台架构

一、批量统计分类 提高效率 节省时间&#xff1a;当商品数量庞大时&#xff0c;手动逐个修改商品分类是一项极其耗时的任务。例如&#xff0c;一个电商平台有数千种商品&#xff0c;如果手动操作&#xff0c;可能需要花费数天甚至数周的时间来完成分类转移。而批量设置功能可以…...

2024年中国各省份碳相关投资分析:区域差异与未来趋势

随着中国“双碳”目标的推进&#xff0c;各省份的碳相关投资逐渐成为推动绿色经济转型的关键力量。2024年&#xff0c;各地的双碳项目进入了快速发展阶段&#xff0c;尤其是在清洁能源、绿色技术和碳捕集领域。本文将分析中国各省份在碳减排、碳中和目标实现过程中的投资重点和…...

【六足机器人】03步态算法

温馨提示&#xff1a;此部分内容需要较强的数学能力&#xff0c;包括但不限于矩阵运算、坐标变换、数学几何。 一、数学知识 1.1 正逆运动学&#xff08;几何法&#xff09; 逆运动学解算函数 // 逆运动学-->计算出三个角度 void inverse_caculate(double x, double y, …...

路由VueRouter的基本使用

1.下载VueRouter到当前工程。 vue2&#xff1a;VueRouter3.x Vuex3.x。 vue3&#xff1a;VueRouter4.x Vuex4.x。 在终端使用命令&#xff1a; year add vue-router3.6.5 2.引入。 import VueRouter from vue-router 3,安装注册。 Vue.use(VueRouter) 4…...

Guiding a Diffusion Model with a Bad Version of Itself

Guiding a Diffusion Model with a Bad Version of Itself Abstract1. Introduction2. Background3. Why does CFG improve image quality?Score matching leads to outliers.CFG 消除异常值Discussion 4 Our method Abstract 在图像生成扩散模型中&#xff0c;主要关注的轴心…...

快速上手!低功耗Air724UG模组软件指南:FTP示例

Air724UG模组集成了高性能处理器和丰富的外设接口&#xff0c;支持多种通信协议&#xff0c;包括FTP&#xff08;文件传输协议&#xff09;。通过Air724UG模组&#xff0c;开发者可以轻松实现设备的远程文件管理功能。一起接着看下去吧&#xff01; 一、简介 FTP&#xff08;…...

GAMES101 完结篇(笔记和作业)

写在前面 我已经把笔记和作业代码放在了GitHub上&#xff0c;欢迎访问GAMES101笔记及作业 (github.com)&#xff0c;如果对你有帮助&#xff0c;欢迎fork or star 下面我想简单介绍一下这里面的东西 Homework Homework文件夹里有0~8的作业框架&#xff0c;参考的其他大佬的代…...

3D Slicer与MONAI人工智能三维影像处理

如何又快又高效的做三维影像&#xff1f;勾画roi&#xff1f; 案例1 患者腹腔占位半月余&#xff0c;完善CT增强扫描&#xff0c;使用Slicer 对肿瘤&#xff0c;胰腺&#xff0c;动脉&#xff0c;静脉进行三维重建。重建时间1-5分钟。 案例2 胸部CT平扫&#xff0c;使用 slic…...

NC65客开单据自定义项处理以及自定义项相关介绍(超级详细带图以及代码NC65自定义项大全)

自定义项教程 自定义项和物料辅助属性简介 自定义档案的概念&#xff1a; NC系统中有大量的档案&#xff0c;这些档案中有相当一部分为系统预置的&#xff0c;鉴于用户对系统应用的个性化需求&#xff0c;系统支持用户自定用户自己的档案&#xff0c;并对其进行维护管理&…...

责任链模式的理解和实践

责任链模式&#xff08;Chain of Responsibility&#xff09;是行为型设计模式之一&#xff0c;它通过将多个对象连成一条链&#xff0c;并沿着这条链传递请求&#xff0c;直到有对象处理它为止。这个模式的主要目的是将请求的发送者和接收者解耦&#xff0c;使请求沿着处理链传…...

【大模型-向量库】详解向量库管理:连接管理、集合管理、向量管理

在向量数据库&#xff08;Vector Database&#xff09;中&#xff0c;向量库管理的概念是非常重要的&#xff0c;因为它涉及到如何高效地存储、索引和检索大规模的向量数据。向量库管理通常包括三个主要方面&#xff1a;连接管理、集合管理和向量管理。以下是对这三者的详细解释…...

MySQL书籍推荐

《高性能MySQL&#xff08;第4版&#xff09;》-西尔维亚博特罗斯 系统层次 Mysql性能优化和高可用架构实践 2020 系统基础 MySQL性能调优与架构设计 系统基础 Mysql技术大全 2021 综合 MySQL数据库应用案例教程 综合实战 从入门到项目实践 综合实战 丰富 超值 MySQ…...

常见的数据结构:

数据结构是计算机科学中的一个核心概念&#xff0c;它涉及到组织、管理和存储数据的方式&#xff0c;以便可以有效地访问和修改数据。数据结构的形式有很多&#xff0c;每种结构都有其特定的用途、优势和局限性。以下是一些常见的数据结构&#xff1a; 1. **数组&#xff08;A…...

快速、高效的数据处理:深入了解 Polars 库

快速、高效的数据处理&#xff1a;深入了解 Polars 库 在数据科学和分析领域&#xff0c;Pandas 一直是 Python 数据处理的标杆。然而&#xff0c;随着数据量的增加&#xff0c;Pandas 在性能上的局限性逐渐显现。为了解决这一问题&#xff0c;越来越多的开发者开始寻找替代方…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...