PHP中如何操作文件(读取、写入、删除)?

PHP文件操作详解(读取、写入、删除)

一、文件读取

PHP提供了多种文件读取方式,开发者可根据需求选择不同方法:

1、file_get_contents()

适合一次性读取整个文件内容,返回字符串。无需手动处理文件句柄,适合小文件。
示例:

$content = file_get_contents('example.txt');
echo $content;

特点:简洁高效,但内存占用较高,不适用于大文件。

2、fread() + fopen()

需配合文件句柄操作,适合分块读取大文件。需手动关闭文件句柄。
示例:

$handle = fopen('example.txt', 'r');
$content = fread($handle, filesize('example.txt'));
fclose($handle);

注意fread()需指定读取字节数,常用filesize()获取文件总大小。

3、逐行读取:fgets()

每次读取一行内容,适用于按行处理文本文件(如CSV)。
示例:

$handle = fopen('example.txt', 'r');
while (!feof($handle)) {
    echo fgets($handle) . "<br>";
}
fclose($handle);

特点:自动移动指针至下一行,可结合feof()判断文件末尾。

4、file()函数

将文件内容按行存入数组,每行为数组元素。
示例:

$lines = file('example.txt');
foreach ($lines as $line) {
    echo $line;
}

适用场景:需逐行处理且需要保留行结构时。

5、readfile()

直接输出文件内容到输出缓冲区,返回读取字节数。适合快速下载或输出文件。
示例:

readfile('example.txt');

注意:无需缓冲处理,但无法对内容进行中间操作。

二、文件写入

PHP的写入操作涵盖基础写入、追加内容和并发控制:

1、file_put_contents()

简化写入操作,支持多种模式:

// 覆盖写入
file_put_contents('example.txt', 'Hello World');
// 追加内容(使用FILE_APPEND)
file_put_contents('example.txt', "\nNew Line", FILE_APPEND | LOCK_EX);

参数说明

    • FILE_APPEND:追加而非覆盖
    • LOCK_EX:写入时独占锁定文件
      特点:自动处理文件句柄,适合简单场景。

  1. fwrite() + fopen()
    提供更细粒度的控制,如文件锁定。示例(带锁实现):

$handle = fopen('example.txt', 'w');
flock($handle, LOCK_EX); // 加锁防止并发冲突
fwrite($handle, 'Content');
flock($handle, LOCK_UN); // 解锁
fclose($handle);

适用场景:需保证数据一致性的高并发写入。

3.目录创建与写入

写入前需确保目录存在,可使用mkdir()创建目录:

if (!file_exists('/path/to/dir')) {
    mkdir('/path/to/dir', 0755, true); // 递归创建目录
}

注意:权限参数(如0755)需根据服务器环境调整。

三、文件删除

1、删除文件:unlink()

删除指定路径的文件,返回布尔值表示操作结果:

if (unlink('example.txt')) {
    echo '文件已删除';
} else {
    echo '删除失败(权限不足或文件不存在)';
}

注意:PHP只能删除运行用户权限内的文件。

2、删除目录:rmdir()

仅能删除空目录。若需删除非空目录,需先递归删除内部文件:

function deleteDirectory($dir) {
    $files = array_diff(scandir($dir), ['.', '..']);
    foreach ($files as $file) {
        $path = "$dir/$file";
        is_dir($path) ? deleteDirectory($path) : unlink($path);
    }
    return rmdir($dir);
}
deleteDirectory('example_dir');

关键点

  • scandir()获取目录内容
  • 递归处理子目录
  • 最后调用rmdir()删除空目录。
四、注意事项

1、错误处理

使用try...catch@抑制错误,避免因权限问题导致脚本中断:

try {
    file_put_contents('example.txt', 'data', LOCK_EX);
} catch (Exception $e) {
    echo "错误:{$e->getMessage()}";
}

2、文件锁机制

多进程/线程环境下,使用flock()避免写入冲突。

3、性能优化

  • 大文件读取优先使用fread()分块处理
  • 频繁写入时,file_put_contents()LOCK_EX可能影响性能,需权衡一致性需求。

通过灵活组合上述函数,可满足从简单日志记录到复杂文件管理的各类需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破碎的天堂鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值