编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN
在网站程序中,经常需要访问保存在本地文件系统中的数据,像查看配置文件是否存在、读取文件内容、向文件中写入新内容、重命名文件以及遍历目录等。PHP提供了一套强大的函数处理文件和目录。
1.查看文件属性:
在计算机系统中,数据是以文件的形式被保存到磁盘中的。为了容易区分不同的数据,就需要尽可能多地对文件进行描述,这个描述就是文件属性,包括文本文件的内容、音乐文件的时间长度、图片文件的大小和数据库文件的创建时间等。
PHP提供了很多系统函数用于获取文件的各种属性,下表列出常用的函数:
函数名称 |
作用说明 |
basename() |
返回路径中的文件名部分 |
Chgrp() |
改变文件所属的组 |
chmod() |
改变文件模式 |
chown() |
改变文件的所有者 |
clearstatcache() |
清除文件状态缓存 |
copy() |
拷贝文件 |
delete() |
删除文件,参加unlike()或unset() |
dirname() |
返回文件中的目录部分 |
disk_free_space() |
返回目录中的可用空间 |
disk_total_space() |
返回一个目录的磁盘总大小 |
diskfreespace() |
disk_free_space()的别名 |
fclose() |
关闭一个已打开的文件指针 |
feof() |
测试文件指针是否到了文件结束的位置 |
fflush() |
将缓冲内容输出到文件 |
fgetc() |
从文件指针中读取字符 |
fgetcsv() |
从文件指针中读取一行并解析CSV字段 |
fgets() |
从文件指针中读取一行 |
fgetss() |
从文件指针中读取一行并过滤到HTML标记 |
file_exists() |
检查文件或目录是否存在 |
file_get_contents() |
将整个文件读入一个字符串 |
file_put_contents() |
将一个字符串写入文件 |
file() |
将整个文件读入一个数组中 |
fileatime() |
获取文件上次被访问的时间戳 |
filectime() |
获取文件最后一次被修改的时间戳 |
filemtime() |
获取文件上次被修改的时间戳 |
filegroup() |
以数字格式获取指定文件的组ID |
fileinode() |
获取文件的inode编号 |
fileowner() |
以数字格式获取文件所有的用户ID |
fileperms() |
获取文件的访问权限 |
filesize() |
获取指定文件的大小,以字节为单位 |
filetype() |
获取指定文件或目录的类型 |
flock() |
轻便的咨询文件锁定 |
fnmatch() |
用模式匹配文件名 |
fopen() |
打开文件或URL |
fpassthru() |
输出文件指针处的所有剩余数据 |
fputcsv() |
将行格式化为CSV并写入文件指针 |
fputs() |
Fwrite()的别名 |
fread() |
读取文件(可安全用于二进制文件) |
fscanf() |
从文件中格式化输入 |
fseek() |
在文件指针中定位 |
fstat() |
通过已打开的文件指针取得文件信息 |
ftell() |
返回文件指针读/写的位置 |
ftruncate() |
将文件截断到给定的长度 |
fwrite() |
写入文件(可安全用于二进制文件) |
glob() |
寻找与模式匹配的文件路径 |
is_dir() |
判断给定文件名是否是一个目录 |
is_executable() |
用于判断指定文件是否可执行 |
is_file() |
判断给定文件名是否为一个正常的文件 |
is_link() |
判断给定文件名是否为一个符号连接 |
is_readable() |
用于判断指定文件是否可读 |
is_uploaded_file() |
判断文件是否是通过HTTP POST上传的 |
is_writable() |
判断给定的文件名是否可写 |
is_writeable() |
is_writable()的别名 |
link() |
建立一个硬连接 |
linkinfo() |
获取一个连接的信息 |
lstat() |
给出一个文件或符号连接的信息 |
mkdir() |
新建目录 |
move_uploaded_file() |
新上传的文件移动到新位置 |
parse_ini_file() |
解析一个配置文件 |
pathinfo() |
返回文件路径的信息 |
pclose() |
关闭进程文件指针 |
popen() |
打开进行文件指针 |
readfile() |
输出一个文件 |
readlink() |
返回符号连接指向的目标 |
realpath() |
返回规范化的绝对路径名 |
rename() |
重命名一个文件或目录 |
rewind() |
倒回文件指针的位置 |
rmdir() |
删除目录 |
set_file_buffer() |
stream_set_write_buffer()的别名 |
stat() |
给出文件的信息 |
symlink() |
建立符号连接 |
tempnam() |
建立一个具有唯一文件名的文件 |
tmpfile() |
建立一个临时文件 |
touch() |
设定文件的访问和修改时间 |
umask() |
改变当前的umask |
unlink() |
删除文件 |
1)filetype()函数:
filetype()函数可以获取指定文件的类型。语法格式为:
string filetype (string $filename)
执行成功将会返回一个表示$filename文件类型的标识符。该标识符有7个可能的值:
·Block:表示驱动器或CD-ROM
·char:表示字符设备
·dir:表示目录
·fifo:表示命名管道
·file:表示硬链接
·link:表示符号链接
·unknown:表示未知类型
filetype()函数执行失败则返回false。如果stat调用失败或者文件类型未知的话,filetype()函数还会产生一个E_NOTICE消息。
2)fstat()函数:
使用fstat()函数同样可以获取文件的各种属性,与其他函数不同的是它要求文件必须已打开,才能获取文件信息。语法格式为:
array fstat(resource $handle)
这里的$handle是一个文件打开的指针,执行后返回一个包括文件信息的数组。示例:
<?php
$fp=fopen("doc/help.doc", "r"); //打开文件
$fstat=fstat($fp); //取得统计信息
fclose($fp); //关闭文件
print_r(array_slice($fstat, 13));
?>
2.打开和关闭文件:
在对文件进行操作之前都必须先打开再操作,而在操作结束时,必须执行关闭操作。打开文件的目的是创建一个文件的缓冲区,以方便后面进行输入/输出操作,而关闭文件的目的则是将缓冲区中未写入的数据保存到文件。
1)打开文件:
fopen()函数可以打开本地文件和URL上的文件。语法格式为:
resource fopen (string $filename, string $mode[, bool $use_include_path[, resource $zcontext]])
fopen()函数会将$filename指定的文件资源绑定到一个流或句柄上,绑定之后就可以通过该句柄与文件进行交互。
如果$filename指定的是一个本地文件,PHP将尝试在文件上打开一个流,该文件必须是PHP可以访问的,因此需要确认文件访问权限允许访问。如果指定的是一个已注册的协议,而协议被注册为一个网络URL,PHP将检查并确认allow_url_fopen已被激活。
Mode参数表示文件打开文件,主要用于确定用户访问资源的模式。下表列出了mode参数可选值:
mode |
说明 |
“r” |
只读方式开始,将文件指针指向文件头 |
“r+” |
读写方式打开,将文件指针指向文件头 |
“w” |
写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建。 |
“w+” |
读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建。 |
“a” |
写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建一个新文件。 |
“a+” |
读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建一个新文件。 |
“x” |
创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回false,并生成一条E_WARNING级别的错误信息。 |
“x+” |
创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则fopen()调用失败并返回false,并生成一条E_WARNING级别的错误信息。 |
如果资源位于本地文件,PHP则认为可以使用本地路径或相对路径来访问此资源。或者可以将fopen()的$use_include_path参数设置为true,这样会使PHP考虑配置指令include_path中指定的路径。参数$zcontext是用来设置文件或流特有的配置参数,以及在多个fopen()请求之间共享文件或特有的信息。如果打开失败,函数将返回false。示例:
$file=fopen("uploadFile/doc/en.doc", "r+");
$file=fopen("siteConfig/user.xml", "wb");
$file=fopen("http://www.dwenzhao.cn/video.html", "r"); //打开网络文件
$file=fopen("ftp://user:password@163.com/video.html", "w"); //使用ftp协议
$file=fopen("c:\\windows\\system\\boot.inf", "r"); //使用绝对路径打开本地文件
在使用绝对路径指定文件时,要注意转义文件路径中的每个反斜线,或者用斜线。
2)关闭文件:
在PHP中使用fclose()函数关闭已经打开的文件。语法格式为:
bool fclose(resource $handle)
fclose()函数将关闭之前打开的由$handle指定的文件句柄,如果成功则返回true,否则返回false。参数$handle必须是fopen()或者fsockopen()成功打开的文件句柄。示例:
$handle=fopen('doc/help.doc', 'r');
fclose($handle);
3.读取文件:
文件打开之后,便可以对文件的内容进行各种操作。
1)读取一行:
PHP提供了4个函数用于从文件中读取一行内容。
①file()函数:
使用file()函数可以将整个文件读入一个数组中。语法格式为:
array file(string $filename[, int $use_include_path[, resource $context]])
其中,参数$filename指定要读取的文件路径;如果需要在$use_include_path路径中搜寻文件,将此参数设为1;参数$context可选,指定文件句柄的环境,若使用null则忽略。
file()函数执行成功返回一个数组,数组中的每个元素都对应文件中的一行,包括换行符在内。如果执行失败则返回false。示例:
<p class="hl">查看赛事内容</p>
<ul class="tl:">
<?php
$filename="doc/game.txt"; //定义文件名
$lines=file($filename); //将一个文件读入数组$lines
//遍历数组,为文件中的内容加上行号
foreach ($lines as $line_num=>$line) {
echo "<li>NO #<b>{$line_num}</b>:".$line."</li>";
}
?>
</ul>
上述代码使用file()读取doc/game.txt文件的内容,并将内容以数组形式保存到$lines中。由于file()函数是逐行读取的,所以可以遍历时添加行号。
file()函数返回的数组中每一行都包括了结束符,因此如果不需要行结束符时还需要使用rtrim()函数。
②fgets()函数:
fgets()函数从打开文件的指针中读取一行。语法格式为:
string fgets(int $handle[, int $length])
在读取数据时遇到换行符(包括在返回值中)、EOF或者已经读取了$length-1字节后停止。如果没有指定$length,则默认为1KB(1024字节)。返回长度最多为$length-1字节的字符串,如果出错则返回false。示例:
<?php
$filename="doc/game.txt"; //指定文件
$fp=fopen($filename, "r"); //打开文件
$line_num=0;
do {
echo "<li>NO #<b>{$line_num}</b>:".fgets($fp)."</li>"; //输出文件内容
$line_num++; //行号递增
} while (!feof($fp)); //判断是否在文件最后
fclose($fp);
?>
由于fgets()函数一次只能读取一行内容,为了输出文件的所有内容,在上述代码的do while循环中使用feof()函数判断是否还有内容。如果有则通过继续执行遍历所有行。
③fgetss()函数:
fgetss()函数功能与fgets()函数基本相同,只是该函数在读取文件时会自动过滤HTML和PHP标记。语法格式为:
string fgetss(int $handle[, int $length[, string $allowable_tags]])
示例:
<title>使用fgetss()函数读取文件内容</title>
<h3>这一行会显示两次,第一次由HTML显示,第二次由fgetss()函数读取显示</h3>
<?php
$filename="fgetss.php"; //指定文件
$fp=fopen($filename, "r"); //打开文件
echo "这一行会执行,但不会由fgetss()函数输出,因为它在PHP代码。<br /><br />";
do {
echo fgetss($fp)."<br />"; //输出文件内容
} while (!feof($fp)); //判断是否在文件最后
fclose($fp); //关闭文件
?>
在PHP中的代码,仅会在页面打开时执行,而在使用fgetss()函数读取时会忽略其中的内容,对于HTML标记也忽略,而只是输出HTML标记的内容。
④fgetcsv()函数:
fgetcsv()函数用于从文件指针中读取一行,并且解析CSV字段,然后再返回一个包含这些字段的数组。语法格式为:
array fgetcsv(int $handle[, int $length[, string $delimiter[, string $enclosure]]])
其中,$handle是一个有效的文件指针;可选参数$length用于指定行的最大长度,必须大于CSV文件内最长的一行,如果忽略该参数那么长度就没有限制,不过会影响执行效率。可选参数$delimiter用于指定CSV分隔符,默认为逗号;可选参数$enclosure用于指定环绕符,默认为双引号。
fgetcsv()函数与fgets()函数相似,不同的是fgetcsv()函数解析读入的行并找出CSV格式的字段,然后返回一个包含这些字段的数组。执行时如果出错,函数返回false。示例:
文件doc/data.txt中保存了比赛选手排名信息,包括名次、姓名、比赛场次和平均得分:
排名,选手,场次,平均分
1,卢克-唐纳,52,9.81
2,泰格-伍兹,40,8.45
3,罗里-麦克,49,8.41
创建PHP文件:
<p class="h1">世界排名</p>
<table width="400" align="center">
<?php
$filename="doc/data.txt"; //指定文件
$fp=fopen($filename, "r"); //打开文件
$tag="th";
while($ary=fgetcsv($fp, 1024, ",")){ //逐行读取文件内容
echo "<tr>";
echo "<$tag>".$ary[0]."</$tag>"; //输出排名
echo "<$tag>".$ary[1]."</$tag>"; //输出选手姓名
echo "<$tag>".$ary[2]."</$tag>"; //输出比赛场次
echo "<$tag>".$ary[3]."</$tag>"; //输出平均得分
$tag="td";
}
fclose($fp);
?>
</table>
2)读取指定字节:
使用安行读取函数可以方便地遍历整个文件,但是如果只需要读取其中一部分内容就需要使用按字节读取函数。PHP提供了3个函数实现这个功能。
①fread()函数:
fread()函数可以读取已经打开的文件,并且可以指定要读取的字符数。语法格式为:
string fread(int $handle, int $length)
该函数从$handle指定的资源中读取$length个字符并返回,如果出错返回false,当遇到下列情况之时读取会终止:当到达EPF(文件末尾)时、读取到$length个字节时、当一个包可用时、已读取了8192个字节时。示例:
<?php
$filename="doc/data.txt"; //指定文件
$fp=fopen($filename, "r"); //打开文件
$getFile=fread($fp, filesize($filename)); //读取全部内容
echo $getFile; //输出
$filetext=fread($fp, 10); //读取10字节内容
echo $filetext; //输出
fclose($fp);
?>
fread()函数不考虑换行符,因此只要使用filesize()函数确定了文件的字节数,就能很方便地读取整个文件。
②fgetc()函数:
fgetc()函数可以从已经打开的文件指针中读取字符,并且只返回一个字符。语法格式:
string fgetc(resource $handle)
返回$handle在指针中的当前字符,如果遇到EOP则返回false。需要注意,文件指针必须有效,并且必须指向一个由fopen()或fsockopen()成功打开的文件。示例:
<?php
$filename="doc/chars.txt"; //指定文件
$fp=fopen($filename, "r"); //打开文件
do {
echo fgetc($fp); //输出一个字符
} while (!feof($fp)); //判断是否在文件最后
fclose($fp); //关闭文件
?>
上述代码使用fgetc()函数遍历文件。
③readfile()函数:
readfile()函数将读取一个文件并写入到输出缓冲,如果成功则返回从文件中读取的字节数,失败则返回false。语法格式:
int readfile(string $filename [, bool $use_include_path[, resource $context]])
示例:
<?php
$filename="doc/chars.txt"; //指定文件
$text=readfile($filename); //读取chars.txt文件的内容到缓冲
echo "<br />本次一共输出$length字节。";
?>
3)读取全部内容:
file_get_contents()函数可以一次性将整个文件的内容读入一个字符串中。语法格式:
string file_get_contents(string $filename [, bool $use_include_path[, resource $context[, int $offset[, int $maxlen]]]])
file_get_contents()函数的使用方法和file()一样,不同的是file_get_contents()函数将文件的内容读入到一个字符串中。函数的offset参数表示读取文件时开始读取的位置,$maxlen表示此次需要读取的字节数。示例:
<p class="h1">查看外部模块的HTML代码</p>
<p>
<?php
$filepath="doc/module.html"; //指定文件路径
$contents=file_get_contents($filepath); //读取文件的内容到变量中
echo "doc/module.html文件内容如下:<br /><br />";
echo htmlspecialchars($contents); //输出读取的文件内容
?>
</p>
file_get_contents()函数的作用是将文件读取到一个字符串,因此整个文件的内容将作为这一个字符串来处理。为不使字符串中的HTML标记被解析,使用htmlspecialchars()函数进行处理。
4)其他读取函数:
PHP中还经常使用fpassthru()函数读取文件内容。fpassthru()函数输出文件指针处的所有剩余数据,语法格式为:
int fpassthru( resource $handle)
该函数将给定的指针从当前的位置读取到EOF,并把结果写到输出缓冲区。如果发生错误返回false,否则返回从$handle读取并传递到输出的字符数。示例:
<p class="h1">使用fpassthru()函数</p>
<p>
<?php
$filepath="doc/chars.html"; //指定文件路径
$file=fopen($filename, "r"); //打开文件
echo "第一行的内容:fgets($file)"; //读取第一行
echo "<br />下面是调用fpassthru()函数返回的内容:<br />";
$length=fpassthru($file); //把文件的其余部分发送到输出缓存
echo "<br />调用fpassthru()函数一共输出了$length字符。";
fclose($file); //关闭文件
?>
</p>
fpassthru()函数还有一个特殊的用法,就是读取二进制文件,例如可以显示一张图片或者下载XLS文件等。示例:
<?php
$filepath="images/ad.gif"; //指定图片路径
$fp=fopen($filename, "rb"); //以二进制打开文件
header ("Content-Type: image/gif"); //设置图片的类型
header ("Content-Length: ".filesize($filename)); //设置图片的大小
fpassthru($fp); //将图片的二进制流输出到页面
exit; //关闭文件
?>
这里,读取二进制文件时应该为fopen()函数的第二个参数附加b标记。
4.移动文件指针:
在读取文件时经常需要在文件中进行跳跃式的访问,而非逐行读取,这时候就需要在读取第一行内容之后将文件指针移动到另外某行。PHP提供了3个移动文件指针的函数。
1)fseek()函数:
fseek()函数用于在打开的文件中把文件指针从当前位置向前或向后移动到新的位置。新位置从文件头开始以字节数为单位,成功则返回0,否则返回-1。语法格式为:
int fseek( resource $handle, int $offset [, int $whence])
该函数将$handle指针移动到$offset指定的位置,如果忽略可选参数$whence,则位置将设置为从文件开始到$offset字节处。$whence将影响指针的位置,有如下可选项:
·SEEK_CUR:设置指针位置为当前位置加上$offset字节
·SEEK_END:设置指针为EOF加上$offset字节,$offset必须设置为负值
·SEEK_SET:设置指针为$offset字节处,这与忽略$whence效果相同
示例:
fseek($file, 0);
fseek($file, -100, SEEK_CUR);
fseek($file, 100, SEEK_END);
2)ftell()函数:
ftell()函数主要用于获取打开文件指针的当前位置。语法格式为:
int ftell( resource $handle)
执行后返回由$handle指定的文件指针的位置,也就是文件流中的偏移量。如果出错则返回false。
3)rewind()函数:
rewind()函数将文件指针定位到打开文件的开头。语法格式为:
bool rewind( resource $handle)
如果执行成功则返回true,否则返回false。
5.写入文件:
读取文件不会改变文件的内容,如果要实现修改文件的功能,必须对文件进行写入操作。
1)fwrite()函数:
fwrite()函数主要用于写入文件。语法格式为:
int fwrite( resource $handle, string $string [, int $length])
fwrite()函数把$string的内容写入文件指针$handle处。如果指定了$length,当写入了$length字节或者写完了$string以后,写入就会停止。该函数返回写入内容的字节数,如果出错则返回false。示例:
PHP中定义一个字符串:
<?php
$str=<<<golf
[赛事专题]
2012沃尔沃中国公开赛(12月15日 10:53)
2011中国高尔夫业余公开赛(10月18日 16:05)
2010英国公开赛(6月29日 11:59)
golf;
?>
使用fwrite()函数将$str指定的内容写入doc/zhuanti.txt文件,代码为:
<?php
$filename='doc/zhuanti.txt'; //指定文件路径
if (is_writable($filename)) {
if (!$handle=fopen($filename, 'a')) { //判断文件是否能正常打开
echo "不能打开文件$filename";
exit;
}
$sizes=fwrite($handle, $str); //将$str写入到打开的文件中
if (!$sizes===false) { //判断文件是否能正常打开
echo "不能写入文件$filename";
exit;
}
echo "成功写入到文件$filename,本次写入$sizes字节数。写入内容如下:";
fclose($handle);
} else {
echo "文件$filename不可写";
}?>
使用fwrite()函数写入时要注意不同类型的操作系统具有不同的行结束符号。因此,在写入内容中想插入一个新行时,就需要使用符号操作系统的行结束符号。基于UNIX的系统使用\n作为行结束字符,基于Windows的系统使用\r\n作为行结束字符,基于Macintosh的系统使用\r作为行结束字符。
2)fputs()函数:
fputs()函数的功能和fwrite()函数一样,并且用法也相同。语法格式为:
int fputs( resource $handle, string $string [, int $length])
3)file_put_contents()函数:
在使用fwrite()和fputs()写入时,必须先调用fopen()函数打开文件,完成之后还要调用fclose()函数关闭文件。而file_put_contents()函数可以使这个过程自动化,只需指定要写入的字符串即可。语法格式:
int file_put_contents( string $filename, string $data [, int $flags[, resource $context]])
其中,$filename参数是要写入的文件名,$data参数是写入内容(也可以是数组,但不能是多维数组),$flags是写入时的标识,可以为FILE_USE_INCLUDE、FILE_APPEND或者LOCK_EX,$context资源。
file_put_contents()函数执行成功后将返回写入到文件内的字节数,失败时返回false。示例:
<p class="h1">创建临时文件</p>
<?php
$str=<<<golf
[球具装备]
最新最权威的评测和选购技巧,海量数据助你成功\r\n
2011中国高尔夫业余公开赛(10月18日 16:05)
2010英国公开赛(6月29日 11:59)
golf;
$tools=array(0=>"KiaMaDoytona推杆",1=>"PINGI20发球木",2=>"TaylorMade R11s发球木");
$filename='doc/temp.txt';
$sizes=file_put_contents($filename, $str); //写入字符串
echo "本次写入了$sizes字节";
file_put_contents($filename, $tools, FILE_APPEND); //追加方式写入数组
?>
6.操作文件:
使用PHP系统函数实现对文件的复制、重命名和删除操作。
1)复制文件:
PHP的copy()函数实现了复制文件功能。语法格式为:
bool copy (string $source, string $dest)
执行后它将文件从$source复制到$dest,成功返回true,否则返回false。示例:
<?php
$filename="doc/chars.txt";
$newfilename="doc/string.txt";
if (copy($filename, $newfilename)) {
echo "复制成功";
} else {
echo "复制失败";
}
?>
如果复制一个零字节的文件,copy()将返回false,但文件仍然会被正确复制。
2)重命名文件:
要对一个文件进行重命名操作可以使用rename()函数。语法格式为:
bool rename (string $oldname, string $newname[, resource $context])
执行时,该函数会尝试将$oldname文件重命名为$newname指定的名称,成功时返回true,否则返回false。示例:
<?php
$oldname="doc/chars.txt";
$newname="doc/all.txt";
if (rename($oldname, $newname)) {
echo "chars.txt已经更改为all.txt";
} else {
echo "对chars.txt的重命名失败";
}
?>
3)删除文件:
要删除一个文件可以使用unlink()函数。语法格式为:
bool unlink (string $filename)
执行后它将删除$filename指定的文件,成功返回true,否则返回false。示例:
<?php
$filename="doc/chars.txt";
if (file_exists($filename)) { //判断文件是否存在
if (unlink($filename)) { //执行删除操作
echo "文件删除成功";
} else {
echo "文件删除失败"; //删除失败
}
}
?>
7.操作目录:
PHP提供了使用系统函数操作目录的功能,可以实现对目录的遍历、对目录的修改和对目录的删除等操作。
1)打开目录:
在PHP中opendir()函数用于打开一个目录,可用于之后的closedir()函数和readdir()函数中。语法格式为:
resource opendir (string path [, resource $context])
执行该函数,如果执行成功返回一个目录句柄,否则返回false。在opendir()函数前面加上“@”符号来隐藏错误信息的输出。示例:
<?php
$path="c:/windows";
if (is_dir($path)) {
if (opendir($path)) {
echo "打开$path目录成功";
} else {
echo "打开$path目录失败";
}
else{
echo $path."不是一个目录";
}
?>
2)关闭目录:
打开的目录使用完毕之后就需要关闭,在PHP中使用closedir()函数关闭打开的目录。语法格式为:
void closedir (resource $dir_handle)
closedir()函数关闭由$dir_handle指定的目录句柄,但是句柄必须是由opendir()函数打开的。
3)遍历目录:
打开目录之后便可以对它进行操作,最常见的就是遍历目录的内容。
①readdir()函数:
readdir()函数返回由opendir()打开目录句柄中的内容。语法格式为:
string readdir (resource $dir_handle)
如果该函数执行成功,则返回一个文件名,根据这个文件名可以列出目录中的所有文件,否则返回false。示例:
<p class="h1">查看上传目录内容</p>
<table width="400" align="center">
<tr>
<th>文件名称</th>
<th>类型</th>
<th>大小</th>
</tr>
<?php
$dirname="Files/";
if (is_dir($dirname)) {
if ($dh=opendir($dirname)) { //打开目录
while (($file=readdir($dh))!==false) {
echo "<tr><td>$file</td>";
if (filetype($dirname.$file)=="dir"){ //判断类型
echo "<td>目录</td><td>0</td>";
}else[
echo "<td>文件</td>";
echo "<td>".filesize($dirname.$file)."</td>";
}
echo "</tr>";
}
closedir($dh);
}
?>
</table>
②scandir()函数:
scandir()函数执行后会返回包含文件和目录的数组,否则返回false。语法格式:
array scandir (string $directory[, int $sorting_order[,resource $context]])
其中,$directory参数表示要遍历的目录;$sorting_order参数用于指定默认的排序顺序是按字母升序排列,如果设为1则按字母降序排列;$context参与用于设置如何配置目录句柄。示例:
<h2>使用scandir()函数读取目录内容</h2>
<?php
$dirname="Files/"; //指定目录
$files=scandir($dirname); //调用scandir()函数,将结果保存到$files数组
echo "<pre>";
print_r($files); //输出数组的内容
echo "</pre>";
?>
对于非目录的路径调用scandir()函数将返回false,并生成一条E_WARNING级的错误。
4)创建目录:
要创建一个目录可以调用mkdir()函数。语法格式为:
bool mkdir (string $pathname[, int $mode[, bool $recursive[, resource $context]]])
执行后,将尝试新建由$pathname参数指定的目录,且默认的$mode是0777,即具有最大的访问权限。新建成功时返回true,否则返回false。示例:
<?php
$newdirname="doc/newdir"; //指定新目录路径
if (!mkdir($newdirname)) { //创建目录
echo "目录创建失败";
} else {
echo $newdirname."目录创建成功";
}
?>
在创建新目录时还可以指定访问权限,下面代码为新建的db目录指定0700权限:
mkdir("mydoc/db", 0700);
5)删除目录:
rmdir()函数的作用与mkdir()函数相反,rmdir()函数可以删除一个目录。语法格式为:
bool rmdir(string $dirname)
执行时将尝试删除$dirname所指定的目录。如果该目录为空,且有相应的权限,则删除成功返回true,否则返回false。示例:
<?php
$dirname="doc/newdir"; //指定目录
if (is_dir($filename)) { //判断目录是否存在
if (rmdir($dirname)) { //执行删除操作
echo "目录删除成功";
} else {
echo "目录删除失败";
}
}
?>
8.解析路径:
PHP提供了一些函数可以实现对文件路径的操作。
1)获取文件名:
basename()函数用于获取路径中的文件名部分。语法格式为:
string basename (string $path[, string $suffix])
这里的$path参数表示需要解析的路径;$suffix为可选参数,表示文件扩展名。如果提供了$suffix参数,不会输出这个扩展名。示例:
<?php
$path="files/images/logo.gif";
$files=basename($path); //$files的值为logo.gif
$files=basename($path, ".gif"); //$files的值为logo
?>
2)获取目录部分:
dirname()函数的作用与basename()函数类似,dirname()函数可以从路径中获取目录部分。语法格式为:
string dirname (string $path)
其中,$path参数是指向一个文件的全路径字符串,返回去掉文件名后的目录名。示例:
<?php
$path="files/images/logo.gif";
echo dirname($path); //输出files/images
echo dirname('C:\windows\system32\boot.ini'); //输出C:\windows\system32
echo dirname('c:/boot.ini'); //输出c:\
?>
3)获取路径中的各个部分:
PHP的pathinfo()函数会以数组的形式返回路径信息。语法格式为:
mixed pathinfo (string $path[, int $options])
其中,$path参数表示路径字符串,返回的关联数组中包括path的4个部分:目录名、基本名、扩展名和文件名,分别通过dirname、basename、extension和filename索引来引用。通过可选参数$options可以指定要返回哪些部分。示例:
<?php
$path="files/images/logo.gif";
$pathinfo=pathinfo($path);
print_r($pathinfo);
echo "扩展名:".$pathinfo('extension');
?>
执行后将会输出:
Array
(
[dirname]=>files/images
[basename]=>logo.gif
[extension]=>gif
[filename]=>logo
}
扩展名:gif
4)获取绝对路径:
realpath()函数可以将网站目录下的某一个相对路径转换成绝对路径。语法格式:
string realpath (string $path)
执行时会将$path参数中的所有路径和目录以及相对路径引用转换为相应绝对路径。如果执行失败则返回false,例如文件不存在时。示例:
realpath ("doc/web/index.php");
realpath ("../images/logo.gif");
realpath ("../index.php");
9.读取磁盘属性:
PHP还提供了两个函数用于读取指定目录所在磁盘的可用空间和总空间大小。
1)获取目录所在磁盘的可用空间:
disk_free_space()函数可以以字节为单位返回指定目录所在磁盘分区的可用空间。语法格式:
float disk_free_space(string $directory)
示例:获取网站根目录所在磁盘和系统盘的可用空间
<?php
$drive="/"; //指定网站根目录
$freespace=disk_free_space($drive); //获取可用空间
echo "网站所在磁盘的剩余空间为:".formatFreeSpace($freespace);
$cfree=disk_free_space("C:"); //获取C盘可用空间
echo "\n系统盘的剩余空间为:".formatFreeSpace($cfree);
function formatFreeSpace($bytes) {
$si_prefix=array('B', 'KB', 'MB', 'GB', 'TB', 'EB', 'ZB', 'YB');
$base=1024;
$class=min((int)log($bytes, $base), count($si_prefix)-1);
return sprintf('%1.2f', $bytes/pow($base, $class)).' '.$si_prefix[class];
}
?>
由于disk_free_space()函数的返回值以字节为单位,因此自定义了formatFreeSpace()函数将字节转换为合适的容量单位。
2)获取磁盘的总容量:
disk_total_space()函数语法与disk_free_space()函数相同。语法格式为:
float disk_total_space(string $directory)
disk_total_space()函数以字节为单位返回指定目录所在磁盘的总容量。
3)获取目录占用空间:
在PHP中提供了用于获取文件大小的filesize()函数、获取磁盘可用空间的disk_free_space()函数以及获取磁盘总容量的disk_total_space()函数,但是并没有提供系统函数用于获取目录占用的空间。
通常一个网站对应一个目录,为了掌握网站空间的使用情况,可以创建一个自定义的PHP函数来完成。示例:
<?php
function getDirSize($dir) {
$handle=opendir($dir);
while (false!==($FolderOrFile=readdir($handle))) {
if ($FolderOrFile!="." && $FolderOrFile!="..") {
if (is_dir("$dir/$FolderOrFile")) {
$sizeResult+=getDirSize("$dir/$FolderOrFile');
} else {
$sizeResult+=filesize("$dir/$FolderOrFile");
}
}
}
closedir($handle);
return $sizeResult;
}
?>
由于PHP内置函数的返回值都是以字节为单位,为了以常见的容量单位显示,可以用前面示例中的formatFreeSpace()函数。示例:
<?php
$mydir="D:/PHPROOT/htdocs"; //要获取的目录
$size_zip=getDirSize($mydir); //计算出目录大小
$size_zip=formatFreeSpace($size_zip); //转换单位
?>