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

获取路径的文件名部分(不管文件系统中是否存在该路径):
在这里插入图片描述
可选参数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);    // 输出与上例相同
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值