获取路径的文件名部分(不管文件系统中是否存在该路径):
可选参数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); // 输出与上例相同