PHP与MySQL程序设计 学习笔记 第十章 处理文件和操作系统

2023-11-13

获取路径的文件名部分(不管文件系统中是否存在该路径):
在这里插入图片描述
可选参数suffix指定一个后缀名,使返回的文件名忽略该后缀:

$path = "/usr/local/text.txt";
print(basename($path) . "\n");    // 输出text.txt
print(basename($path, "t.txt"));    // 输出tex

获取路径的目录部分:
在这里插入图片描述

$path = "/usr/local/text.txt";
print(dirname($path));    // 输出/usr/local

返回路径的信息数组,信息数组中包括目录名、文件名、扩展名:
在这里插入图片描述

$path = "/usr/local/text.txt";
print_r(pathinfo($path));

运行它:
在这里插入图片描述
可选参数options可以是以下元素的或:PATHINFO_DIRNAME、PATHINFO_BASENAME、PATHINFO_EXTENSION、PATHINFO_FILENAME,此参数会使返回值变为字符串,字符串的内容根据options而定,由于有互斥的选项,如PATHINFO_EXTENSION和PATHINFO_DIRNAME,由于两个都指定时只有一个会生效,因此最好指定时不要冲突:

$path = "/usr/local/text.txt";
print_r(pathinfo($path, PATHINFO_EXTENSION) . "\n");
print_r(pathinfo($path, PATHINFO_BASENAME) . "\n");
print_r(pathinfo($path, PATHINFO_EXTENSION | PATHINFO_FILENAME) . "\n");
print_r(pathinfo($path, PATHINFO_FILENAME | PATHINFO_EXTENSION));

运行它:
在这里插入图片描述

将相对路径转换为绝对路径,当文件不存在时返回false:
在这里插入图片描述

chdir('/var/www/');
echo realpath('./../../etc/passwd');    // 输出/etc/passwd

如果参数是符号链接:
在这里插入图片描述

print(realpath("/root/a.link") . "\n");

运行它:
在这里插入图片描述
以字节为单位返回文件大小:
在这里插入图片描述
在这里插入图片描述

print(filesize("/root/a.out") . "\n");

运行它:
在这里插入图片描述
当路径为软链接时,会跟随软链接输出它指向文件的大小。

返回指定目录所在磁盘分区的可用空间(字节数):
在这里插入图片描述
如果目录路径不对,则返回false,同时触发一个warning级别的报告。

print(disk_free_space("/root") . "\n");    // 输出2492497920

计算目录所在磁盘分区总容量(字节数):

在这里插入图片描述
该函数返回值与disk_free_space函数返回值相减就是目录所在磁盘已使用的字节数。

php不提供获取目录大小的函数,虽然可以使用exec或system函数系统级调用du统计目录的磁盘使用情况,但出于安全原因这通常是禁用的,以下递归代码可获取目录大小:

function directorySize($directory) {
    $directorySize = 0;

    if ($dh = @opendir($directory)) {    // 打开当前目录,@表示出错了也不报错
        while (($filename = readdir($dh))) {    // 读出每一项目录项
            if ($filename != "." && $filename != "..") {    // 如果不是当前目录或上级目录
		        if (is_file($directory . "/" . $filename)) {    // 如果当前目录项是文件,则直接计算文件大小
			    	$directorySize += filesize($directory . "/" . $filename);    
				}

				if (is_dir($directory . "/" . $filename)) {    // 如果当前目录项是目录,则递归计算目录大小
				    $directorySize += directorySize($directory . "/" . $filename);
				}
	    	}
		}
    }

    @closedir($dh);
    
    return $directorySize;
}

$directory = '/root';
$totalSize = round(directorySize($directory) / (1024 * 1024), 2);
printf("Directory %s: %f MB\n", $directory, $totalSize);

运行它:
在这里插入图片描述
确定文件的最后访问时间,采用UNIX时间戳格式,出错时返回false:
在这里插入图片描述
UNIX时间戳是从1970.1.1 00:00:00以来经过的秒数,闰秒不计算。

确定文件的最后改变时间,采用UNIX时间戳格式,出错时返回false:
在这里插入图片描述
最后改变时间对应文件的i节点的信息更改时间,而以下函数可返回文件的最后修改时间,采用UNIX时间戳格式,出错时返回false:
在这里插入图片描述
资源常与可以发起输入或输出流的实体联系在一起,标准输入和标准输出、文件和网络套接字都是资源。

Windows上换行符是\r\n,Linux上是\n。

程序通过EOF判断是否达到了文件末尾,php用feof函数确定是否到达了资源的末尾:
在这里插入图片描述

$fh = fopen("afile", 'r');

while (!feof($fh)) echo fgets($fh);

fclose($fh);

运行它:
在这里插入图片描述
fopen函数将文件绑定到一个句柄,之后就可通过此句柄与文件交互:
在这里插入图片描述
此函数还能通过一些协议(如HTTP、HTTPS、FTP)打开资源。

参数mode指定对资源的访问级别:
在这里插入图片描述
如果资源位于本地文件系统,则可用绝对路径和相对路径来访问资源,或将可选参数use_include_path设为1,表示PHP会考虑配置指令include_path中指定的路径。

可选参数context可设置文件或流特有的配置参数,以及在多个fopen请求间共享文件或流特有的信息。

$fh = fopen('/var/www/users.txt', 'r');    // 打开本地的文件
$fh = fopen('/var/www/docs/summary.html', 'w');    // 打开HTML文档的写句柄
$fh = fopen('summary.html', 'w', 1);    // 在当前目录和include_path指令指定的路径中搜索该文件
$fh = fopen('http://www.example.com/', 'r');    // 打开一个远程index.html文件的只读流

一旦完成资源的处理,就要撤销其指针,以下函数会关闭之前打开的由文件句柄指定的文件指针,成功时返回true,失败返回false:
在这里插入图片描述
参数filehandle必须是fopen或fsockopen函数打开的已存在的文件指针。

将文件读取到数组中,各元素由换行符分隔,同时换行符仍附加在每个元素的末尾:
在这里插入图片描述
该函数不必使用句柄读取文件:

$fileArr = file("afile");
print_r($fileArr);

运行它:
在这里插入图片描述
可选参数use_include_path为1时,file函数还会在include_path指定的路径中搜索文件。

可选参数context指示流的上下文。

将文件内容读取到字符串中:
在这里插入图片描述

$fileArr = file_get_contents("afile");
print($fileArr);

运行它:
在这里插入图片描述
可选参数use_include_path和context与前两个函数完全相同。

可选参数offset指定了从文件中开始读的字节偏移量。

可选参数maxlen指定了读入字符串的最大字节数。

将csv文件读入数组:
在这里插入图片描述
csv文件是以逗号分隔的文件,常用于程序之间转移表格数据。Microsoft Excel、Access、MySQL、Oracle、PostgreSQL都能导入和导出csv数据。

$fh = fopen("files.csv", 'r');
while (!feof($fh))
    print_r(fgetcsv($fh));

运行它:
在这里插入图片描述
files.csv文件内容如下:
在这里插入图片描述

可选参数length指定一行的最大长度,此长度必须大于文件中最长的一行,省略相当于将其设为0,意味着没有指定最大长度,这样一行可以是任意长度的,但如果不设置该值会导致性能下降。

可选参数delimiter指明分隔符,默认是逗号。

可选参数enclosure默认是双引号,其中的delimiter不会被当作分隔符,假如files.csv文件中内容如下图:
在这里插入图片描述
且代码如下:

$fh = fopen("files.csv", 'r');
while (!feof($fh))
    print_r(fgetcsv($fh, 1024, ',', "\""));

此时运行结果为:
在这里插入图片描述

以下函数读取指定资源遇到换行或EOF后返回:
在这里插入图片描述
可选参数length指明返回的字符串长度,最多返回length-1个字符,如忽略该可选参数,则默认值为1k。

如果读取到了文件末尾,则返回false。

以下函数作用同函数fgets函数,但它忽略所有的HTML和PHP标签:
在这里插入图片描述
可选参数allowable_tags为可接受的标签列表,是一个形如"<a><html>"的字符串。

一次读取资源中的一个字符,读到eof时返回false:
在这里插入图片描述

$fh = fopen("afile", "r");
while ($areturn = fgetc($fh)) {
    print($areturn);
}
fclose($fh);

运行它:
在这里插入图片描述
从资源中读取length个字符,只有到达eof或读取到length个字符时返回:
在这里插入图片描述
此函数将换行符当作普通字符,有助于读取二进制文件,只要使用filesize函数确定了文件的字符数,就能读取整个文件。

读取文件名指示的整个文件内容:
在这里插入图片描述
可选参数use_include_path将在配置指令include_path指定的路径中搜索文件。

php的文件io函数在配置参数fopen_wrappers启用的情况下,可以通过URL打开远程文件。

按预定义的格式读取文件:
在这里插入图片描述
如果文件格式为:
在这里插入图片描述

可读出文件中的特定格式串:

$fh = fopen("afile", "r");
while ($areturn = fscanf($fh, "%d-%d-%d")) {
    print_r($areturn);
}
fclose($fh);

运行它:
在这里插入图片描述
将字符串写入文件:
在这里插入图片描述
可选参数length表示要写入到文件中的字符数。如未指定该值,则会将字符串完整地写入文件。

$fh = fopen("afile", "w");
fwrite($fh, "aaa", 2);
fclose($fh);

运行它:
在这里插入图片描述
如果提供了可选参数length,则配置参数magic_quote_runtime会被忽略,此参数将来自所有外部资源(如数据库和文本文件)数据中的引号使用反斜线转义。

将文件指针移到指定的偏移量:
在这里插入图片描述
可选参数whence的取值:
1.SEEK_CUR:将指针设为以当前位置为基准的offset处。
2.SEEK_END:将指针设为以EOF为基准的offset处,此时offset必须为负值。
2.SEEK_SET:将指针设为以开头为基准的offset处,此值为默认值。

获取当前文件指针的偏移量:
在这里插入图片描述
将文件指针偏移移回资源开头:
在这里插入图片描述
打开目录:
在这里插入图片描述
关闭目录:
在这里插入图片描述
返回目录中的一个目录项:
在这里插入图片描述
读取当前目录中的所有目录项:

$dir = opendir(".");
while ($dirItem = readdir($dir)) {
    print($dirItem . "\n");
}
closedir($dir);

运行它:
在这里插入图片描述

如果可选参数directory_handle未指定,则从opendir函数打开的最后一个链接读取。

将目录中的目录项读入数组,发生错误时返回false:
在这里插入图片描述

print_r(scandir("."));

运行它:
在这里插入图片描述
可选参数sorting_order可设为1,以目录项降序排列内容,而不是默认的升序:

print_r(scandir(".", 1));

运行它:
在这里插入图片描述
可选参数context指示流的上下文。

删除目录,删除成功返回true,否则返回false,删除目录时,必须有权限,且目录必须为空:
在这里插入图片描述
如果想删除非空目录,可使用system或exec函数执行系统级命令,也可以递归地删除目标目录及其中内容,两种方法都需要有删除权限,以下是递归删除非空目录的代码:

function deleteDirectory($dir) {
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) != false) {
		    if (($file == "." || $file == "..")) continue;
	
		    if (is_dir($dir . '/' . $file)) {
		        deleteDirectory($dir . '/' . $file);
		    } else {
		        unlink($dir . '/' . $file);
		    }
		}

		closedir($dh);
		rmdir($dir);
    }
}

$dir = "testDir";
deleteDirectory($dir);

重命名文件,成功时返回true,否则返回false,必须有权限改名:
在这里插入图片描述
touch文件,改变文件的最后修改时间和最后访问时间,成功时返回true,失败返回false,如果文件不存在则创建它,但必须有权限创建:
在这里插入图片描述
可选参数time指定要修改的时间值,如未指定,则使用当前时间值。

可选参数atime指定时,将该参数表示的时间设为最后访问时间。

将参数arguments用单引号包围并返回,arguments参数中的单引号用转义符转义:
在这里插入图片描述
其效果是把shell命令的参数部分传给参数arguments时,会把它用单引号括起来从而认为是单个参数并返回:

print(escapeshellarg("-a -l") . "\n");

运行它:
在这里插入图片描述
escapeshellarg函数的一个使用场景:

$username = 'myuser;rm -rf .';
system('groups ' . $username);    // 执行该命令时相当于在shell中输入groups myuser;rm -rf .
                                  // 从而改变第一个命令的含义,删除了当前目录中所有内容

而使用了该函数时:

$username = 'myuser;rm -rf .';
system('groups ' . escapeshellarg($username));   // 此时相当于执行了groups 'myuser;rm -rf .',会报错

转义shell元字符:
在这里插入图片描述

$username = 'myuser;id';
print(escapeshellcmd('groups ' . $username) . "\n");

运行它:

在这里插入图片描述
此时分号被转义了,用于shell参数中带shell元字符的情况:
在这里插入图片描述

该函数能转义的符号有&、#、;、`、|、*、?、~、<、>、^、(、)、[、]、{、}、$、\、\x0A和\xFF,单引号’和双引号"仅在不配对儿的时候被转义。在windows上,这些字符和%、!会被替换为空格。

执行系统级命令:
在这里插入图片描述
它会运行cmmand参数表示的命令,并返回输出的最后一行,可选项参数output可保存每一行的输出。可选参数return_var可获取命令的返回状态。

执行命令并返回命令的执行结果:
在这里插入图片描述
可选参数return_var可获取命令的执行状态。

执行命令但返回二进制输出:
在这里插入图片描述
使用反引号括起来的字符串是shell命令:

$date = `date`;
print($date);

运行它:
在这里插入图片描述
执行shell命令并将执行结果返回:
在这里插入图片描述

$date = shell_exec("date");    // $date此时是date命令的执行结果字符串
print($date);    // 输出与上例相同
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP与MySQL程序设计 学习笔记 第十章 处理文件和操作系统 的相关文章

  • 初学前端,学习路线图必不可少,更有【95页】初级前端模块笔记!

    前言 在初学前端的时候 我们总会遇到一些问题 我们可以在网上看到很多关于前端的这些问题 你们都是怎么学web前端的 零基础 怎么自学好前端 前端需要学多久 都学哪些知识 想成为一名合格的前端工程师 需要掌握哪些技能 下面是给初学前端的小伙伴
  • Java动态性之反射机制

    一 动态语言 程序运行时 可以改变程序结构或变量类型 典型的语言 python ruby javascript等 function test var s var a 3 var b 5 alert a b eval s c c java不是
  • python中如何查看statsmodels相关知识

    运行arima的一个相关程序时 总是打印一些我不需要的数据 如下 RUNNING THE L BFGS B CODE Machine precision 2 220E 16 N 1 M 12 This problem is unconstr
  • 2023新版Java学习路线视频讲解,程序员自学必备指南

    深知大家自学Java的苦 苦于没有系统的知识体系 不知道该学什么 看哪个视频比较好 因此 老杜精心录制了这版超实用且全面的Java学习路线 目的在于帮助自学Java的初学者减少迷茫和时间浪费 制定出一份系统的学习计划和路线 让你学Java更
  • comsol光学仿真01

    与RF模块比较 1 RF模块适合模拟与波长大小相近的域 2 最大网格大院大小必须是波长的一部分 大约在波长的1 6 缺点 计算过慢 与射线光学比较 1 射线 几何 光学适合模拟远大于波长的结构 2 能够有效追踪经过复杂几何区域和材料的射线
  • arm汇编指令详细整理及实例详解

    目录 一 简介 二 ARM 汇编指令说明 2 1 32位数据操作指令 2 2 32位存储器数据传送指令 2 3 32位转移指令 2 4 其它32位指令 三 实例讲解 3 1 MRS 3 2 MSR 3 3 PRIMASK 3 4 FAULT
  • lazarus开发应用提供http接口

    lazarus开发应用提供http接口 简单试用了一下fphttpapp 发现非常易用 直接支持中文内容 引用3个核心单元 fphttpapp httpdefs httproute 启用端口定义路由 procedure route1 aRe
  • mysql8.0查看用户_MySQL 8.0用户和角色管理

    MySQL8 0新加了很多功能 其中在用户管理中增加了角色的管理 默认的密码加密方式也做了调整 由之前的sha1改为了sha2 同时加上5 7的禁用用户和用户过期的设置 这样方面用户的管理和权限的管理 也增加了用户的安全性 MySQL8 0
  • pytorch的序列化

    PyTorch是一个基于Python的开源机器学习框架 序列化是指将模型 张量或其他Python对象转换为一种可存储的格式 以便于在后续的时间点进行加载 重用或共享 通过序列化 可以将模型保存到磁盘上 方便后续再次加载和使用 具体来说 Py
  • 【Reacte】 React 嵌入JS表达式 、条件渲染 、数组列表渲染 、样式处理

    嵌入JS表达式 语法 js表达式 let content 插入的内容 let h1 h1 我是通过JSX创建的元素 content h1 描述 1 只要是合法的js表达式都可以进行嵌入 2 JSX自身就是JS表达式 注意 语法是单花括号 不
  • 操作系统-c语言实现空闲块表的存储空间的分配和回收 ...

    include
  • SQL查询表中最后一条数据

    SQL查询表中最后一条数据 文章目录 SQL查询表中最后一条数据 准备数据表 查询最后一条数据 准备数据表 建立student表 并插入几条数据 查询最后一条数据 本文共分为三种方式 max id 函数 select from studen
  • How to be a under-graduate student

    1 想法去搜集这种记载的文字 所以研究生要学会去搜集资料或信息 2所以我们要看很多的资料 看资料是我们研究生阶段特别重要的 不要轻视了 3 现在培养研究生 就是培养你们要勇于拓宽科技新领域 到第一线去干4论文记载了一个研究课题的过程和结论
  • 电容的频率特性曲线

    电容的频率特性曲线 电容 电容 Capacitance 亦称作 电容量 是指在给定电位差下的电荷储藏量 记为C 国际单位是法拉 F 一般来说 电荷在电场中会受力而移动 当导体之间有了介质 则阻碍了电荷移动而使得电荷累积在导体上 造成电荷的累
  • python-opencv计算重叠矩形面积IOU

    import cv2 import numpy as np def calc riou r1 r2 r1 np array r1 r2 np array r2 rect1 r1 0 r1 1 r1 2 r1 3 r1 4 rect2 r2

随机推荐

  • Redis第二十四讲 Redis集群如何确保数据能被插入到同一个哈希槽与集群的哈希槽为什么是16384

    为什么哈希槽是16384 Redis 集群并没有使用一致性hash 而是引入了哈希槽的概念 Redis 集群有16384个哈希槽 每个key通过CRC16校验后对16384取模来决定放置哪个槽 集群的每个节点负责一部分hash槽 但为什么哈
  • 25_Vue3路由-VueRouter的基本使用及动态路由和路由嵌套

    Vue3路由之Vue router的基本使用及路由嵌套和动态路由 认识前端路由 路由其实是网络工程中的一个术语 在架构一个网络时 非常重要的两个设备就是路由器和交换机 当然 目前在我们生活中路由器也是越来越被大家所熟知 因为我们生活中都会用
  • 代理模式 与装饰模式的区别 干货

    装饰器模式关注于在一个对象上动态的添加方法 然而代理模式关注于控制对对象的访问 换句话 说 用代理模式 代理类 proxy class 可以对它的客户隐藏一个对象的具体信息 因此 当使用代理模式的时候 我们常常在一个代理类中创建一个对象的实
  • 关于机器学习中查准率与查全率(召回率)矛盾关系的探讨

    昨天和舍友讨论查准率和查全率 很多资料中指出之所以需要F1值的原因在于准确率与召回率的关系是矛盾的 即查准率高的查全率低 查全率高的查准率低 因此需要F1值综合度量 但关于为什么两者的关系是矛盾的 一直不太理解 现在看过帖子后总结一些想法
  • ERROR: The install method you used for conda--probably either `pip install conda` or `e

    TOCERROR The install method you used for conda probably either pip install conda or easy install conda is not compatible
  • MySQL安装(全网最全最详细教程)

    目录 1 MySQL的卸载 1 1 停止MySQL服务 1 2 软件的卸载 2 MySQL的下载 安装 配置 2 1 MySQL的4大版本 2 2 软件的下载 2 3 软件的安装 2 4 软件的配置 3 多版本mysql同时安装 4 安装过
  • 西门子PLC全系列模块接线

    https www siemensplc com biancheng 10649 html
  • 最燃黑客情报官薛锋:端起AK伏特加,代表人民把坏人抓

    文 史中 一 情报专家从未凋零真相并不总是像女神一样遥不可及 在二战最为焦灼的时候 盟军迫切地想知道一件事情 德国人究竟有多少坦克 于是他们派出间谍 破译电报 对德国俘虏刑讯逼供 得出的结论是 德国每个月可以生产1000多辆坦克 可是好像哪
  • 用echo输出多个空行

    大家用shell编程 用echo输出空行的时候 通常想到就是用N个echo 如下输出三个空行 echo echo echo 虽然内心里还是觉得如上写法有些丑陋 其实 echo是还有更多用法的 这在手册里面是有说明的 通过查看手册 我们可以知
  • 深度学习系列资料总结

    作者简介 CSDN 阿里云人工智能领域博客专家 新星计划计算机视觉导师 百度飞桨PPDE 专注大数据与AI知识分享 公众号 GoAI的学习小屋 免费分享书籍 简历 导图等 更有交流群分享宝藏资料 关注公众号回复 加群 或 链接 加群 专栏推
  • opencv学习笔记

    include quickdemo h include shuzu h include
  • Flask数据库

    文章目录 一 ORM 1 1 什么是ORM 1 2 ORM的优缺点有哪些 1 3 Flask SQLAlchemy安装及设置 1 4 其他配置信息 1 5 常用的SQLAlchemy字段类型 1 6常用的SQLAlchemy列选项 常用的S
  • java docker nacos 9848端口报错

    问题 9848报错 新版本部署 Nacos2 0版本相比1 X新增了gRPC的通信方式 因此需要增加2个端口 新增端口是在配置的主端口 server port 基础上 进行一定偏移量自动生成 端口 与主端口的偏移量 描述 9848 1000
  • 【PTA】矩阵列平移

    给定一个 n n 的整数矩阵 对任一给定的正整数 k
  • python安装及配置

    1 python的下载及安装 1 1下载 从官网下载 https www python org 如图 点击downloads按钮 在下拉框中选择系统类型 windows Mac OS Linux等 选然后择下载最新版本的Python 1 2
  • JavaArrayList集合基础&学生管理系统

    1 ArrayList 集合和数组的区别 共同点 都是存储数据的容器 不同点 数组的容量是固定的 集合的容量是可变的 1 1 ArrayList的构造方法和添加方法 public ArrayList 创建一个空的集合对象 public bo
  • 爬虫:你一定要知道的模板(附源码)

    爬虫 你一定要知道的模板 附源码 作为一名cv程序员 梦想是造飞机 现实是拧螺丝 普通的爬虫 无非就是固定的模板 xpath bs定位标签 axios返回数据 json解析 selenium json解析版 import requests
  • chatgpt赋能python:Python和数学建模:如何参与数学建模比赛

    Python和数学建模 如何参与数学建模比赛 介绍 数学建模比赛通常是学术界和工业界一起组织的比赛 旨在让学生掌握实际问题的建模方法以及如何处理数据 分析和解决实际问题 Python是一个流行的编程语言 广泛应用于数据科学和数学建模领域 因
  • 单链表中求中间节点

    问题描述 求单链表中间节点的值 如果中间有2个 只要第一个 就是偶数情况下 只要中间的第一个 速度要快 解决方法 可以参照这篇博文 http blog csdn net dawn after dark article details 736
  • PHP与MySQL程序设计 学习笔记 第十章 处理文件和操作系统

    获取路径的文件名部分 不管文件系统中是否存在该路径 可选参数suffix指定一个后缀名 使返回的文件名忽略该后缀 path usr local text txt print basename path n 输出text txt print