专栏首页李蔚蓬的专栏PHP笔记 | 文件系统

PHP笔记 | 文件系统

1. PHP文件系统之读取文件内容

  • PHP具有丰富文件操作函数最简单读取文件的函数file_get_contents, 可以将整个文件全部读取到一个字符串中。
$content = file_get_contents('./test.txt');
  • file_get_contents也可以 通过参数控制读取内容开始点以及长度
$content = file_get_contents('./test.txt', null, null, 100, 500);
  • PHP也提供类似于C语言 操作文件的方法, 使用fopen,fgets,fread等方法, fgets可以文件指针读取一行freads可以读取指定长度字符串
$fp = fopen('./text.txt', 'rb');
while(!feof($fp)) {
    echo fgets($fp); //读取一行
}
fclose($fp);
$fp = fopen('./text.txt', 'rb');
$contents = '';
while(!feof($fp)) {
    $contents .= fread($fp, 4096); //一次读取4096个字符
}
fclose($fp);
  • 使用fopen打开的文件,最好使用fclose关闭文件指针,以避免文件句柄被占用。

2. PHP文件系统之判断文件是否存在

  • 一般情况下在对文件进行操作的时候需要先判断文件是否存在, PHP中常用来判断文件存在的函数两个——is_filefile_exists.
  • 如果只是判断文件存在, 使用file_exists就行, file_exists不仅可以判断文件是否存在, 同时也可以判断目录是否存在; 从函数名可以看出, is_file是确切的判断给定的路径是否是一个文件
$filename = './test.txt';
if (file_exists($filename)) {
    echo file_get_contents($filename);
}
$filename = './test.txt';
if (is_file($filename)) {
    echo file_get_contents($filename);
}
  • 更加精确的可以使用is_readableis_writeable文件是否存在的基础上, 判断文件是否可读可写
$filename = './test.txt';
if (is_writeable($filename)) {
    file_put_contents($filename, 'test');
}
if (is_readable($filename)) {
    echo file_get_contents($filename);
}

demo:

<?php
$filename = '/data/webroot/usercode/code/resource/test.txt';
//判断如果$filename文件存在的话 就输出文件内容
if(file_exists($filename)){
    echo '文件存在';
}else{
    echo '文件不存在';
}

3. PHP文件系统之取得文件的修改时间

  • 文件有很多元属性, 包括:文件的所有者、创建时间、修改时间、最后的访问时间等。

fileowner:获得文件的所有者 filectime:获取文件的创建时间 filemtime:获取文件的修改时间 fileatime:获取文件的访问时间

  • 其中最常用的是文件的修改时间, 通过文件的修改时间,可以判断文件的时效性, 经常用在静态文件或者缓存数据更新

date('Y-m-d H:i:s',time()) 按24小时制 date('Y-m-d h:i:s',time()) 按12小时制

  • 'Y-m-d H:i:s'——年月日 时分秒
$mtime = filemtime($filename);
echo '修改时间:'.date('Y-m-d H:i:s', filemtime($filename));

demo:

<?php
$filename = '/data/webroot/usercode/code/resource/test.txt';
echo '所有者:'.fileowner($filename).'<br>';
echo '创建时间:'.filectime($filename).'<br>';
echo '修改时间:'.filemtime($filename).'<br>';
echo '最后访问时间:'.fileatime($filename).'<br>';

//给$mtime赋值为文件的修改时间
$mtime =  filemtime($filename); 
//通过计算时间差 来判断文件内容是否有效
if (time() - $mtime > 3600) {
    echo '<br>缓存已过期';
} else {
    echo file_get_contents($filename);
}

4. PHP文件系统之取得文件的大小

  • 通过filesize函数可以取得文件的大小,文件大小是以字节数(也就是b)表示的。

  • 所以filesize函数的输出结果要改成“kb”为单位的话,便需除以1024的一次方; 要改成‘mb’的话,则需除以1024的二次方,以此类推; 其demo自定义函数见下方第二个代码块;
$filename = '/data/webroot/usercode/resource/test.txt';
$size = filesize($filename);

如果要转换文件大小的单位,可以自己定义函数来实现。

function getsize($size, $format = 'kb') {
    $p = 0;
    if ($format == 'kb') {
        $p = 1;
    } elseif ($format == 'mb') {
        $p = 2;
    } elseif ($format == 'gb') {
        $p = 3;
    }
    $size /= pow(1024, $p);
    return number_format($size, 3);
}

$filename = '/data/webroot/usercode/code/resource/test.txt';
$size = filesize($filename);

$size = getsize($size, 'kb'); //进行单位转换
echo $size.'kb';

  • 关于number_format()函数
  • 值得注意的是,没法通过简单的函数来取得目录的大小目录的大小是该目录下所有子目录以及文件大小总和, 因此需要通过递归的方法来循环计算目录的大小

5. PHP文件系统之写入内容到文件

  • 与读取文件对应,PHP写文件也具有两种方式,最简单的方式是采用file_put_contents
$filename = './test.txt';
$data = 'test';
file_put_contents($filename, $data);

上例中,$data参数可以是一个一维数组, 当$data是数组的时候,会自动的将数组连接起来,相当于$data=implode('', $data);

  • 同样的,PHP也支持类似C语言风格的操作方式,采用fwrite进行文件写入。
$fp = fopen('./test.txt', 'w');
fwrite($fp, 'hello');
fwrite($fp, 'world');
fclose($fp);

又有写法:

$fp = fopen($filename, 'w');
fwrite($fp, 'hello world'); 
fclose($fp); 
--------------------------

file_put_contents($filename, 'hello world');

6. PHP文件系统之删除文件

  • Unix系统命令类似,PHP使用unlink函数进行文件删除
unlink($filename);
  • 删除文件夹使用rmdir函数, 文件夹必须为空, 如果不为空或者没有权限则会提示失败
rmdir($dir);
  • 如果文件夹中存在文件, 可以先循环删除目录中的所有文件, 然后再删除该目录循环删除可以使用glob函数遍历所有文件
foreach (glob("*") as $filename) {
   unlink($filename);
}

主要参考资料(慕课网.PHP进阶篇)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 小程序 Tip | 文档、环境、开发工具界面与特性

    可以在AppData面板中编辑数据, 编辑后数据会及时反馈到界面上:

    凌川江雪
  • 跨程序共享数据——Content Provider 之 创建自己的内容提供器

    本模块共有四篇文章,参考郭神的《第一行代码》,对Content Provider的学习做一个详细的笔记,大家可以一起交流一下:

    凌川江雪
  • 手把手教你使用Android studio生成正式签名的APK文件

    点击Android studio 右侧工具栏的Gradle → 项目名 → :app → Tasks →android, 双击signingReport:

    凌川江雪
  • Linux用户和权限管理看了你就会用啦

    没想到上一篇能在知乎获得千赞呀,Linux也快期末考试了,也有半个月没有写文章了。这篇主要将Linux下的用户和权限知识点再整理一下。

    Java3y
  • CentOS6.5菜鸟之旅:文件权限详解

    一、前言                                   Linux下所有资源、设备均被视作文件来操作,而文件权限则是决定用户可各文件操作的...

    ^_^肥仔John
  • 快速学习Linux-权限管理

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    cwl_java
  • 无人货架决战生死之巅,寒冬之下如何才能成为最后赢家?

    孟永辉
  • 腾讯UnLua正式开源了!

    ? 腾讯UnLua正式开源了! 欢迎到:https://github.com/Tencent/UnLua下关注、加星和加Fork。 UnLua是Unreal ...

    WeTest质量开放平台团队
  • 【陆勤学习】推荐系统开发的十个关键点

    亚马逊的CEO Jeff Bezos曾经说过,他的梦想是“如果我有100万个用户,我就要为他们做100万个亚马逊网站”。智能推荐系统承载的就是这个梦想,即通过数...

    陆勤_数据人网
  • 绝对干货!NLP预训练模型:从transformer到albert

    语言模型是机器理解人类语言的途径,17年的transformer是语言模型摆脱rnn,lstm建模的一次尝试,后续的bert则是大力出奇迹的代表,用更大的模型和...

    新智元

扫码关注云+社区

领取腾讯云代金券