文章来自:zhouxiaoshuai
文件和目录处理相关
题:
不断在文件hello.txt头部写入一行"hello world" 字符串,要求代码完整
考点:文件操作/写入操作;
延伸:目录操作函数,其他文件操作;
文件读写操作 文件系统函数
fopen()
:用来打开一个文件,打开是需要指定打开模式;
打开模式:
'r' 只读方式打开,将文件指针指向文件头。
'r+' 读写方式打开,将文件指针指向文件头。
'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零(清空文件)。如果文件不存在则尝试创建之。
'w+' 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
'a' 写入方式打开,将文件指针指向文件末尾(追加的形式)。如果文件不存在则尝试创建之。
'a+' 读写方式打开,将文件指针指向文件末尾(读写追加)。如果文件不存在则尝试创建之。
'x' 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。
'x+' 创建并以读写方式打开,其他的行为和 'x' 一样。
'b' 打开一个二进制文件。与此对应还可以使用 'b' 来强制使用二进制模式,这样就不会转换数据。要使用这些标记,要么用 'b' 或者用 't' 作为 mode 参数的最后一个字符。
't' Windows 下提供了一个文本转换标记('t')可以透明地将 \n 转换为 \r\n
【b 和 t 是配合前面的四大类使用的】
写入操作:
-
fwrite()
:写入文件(可安全用于二进制文件); -
fputs()
:fwrite()
的别名;
读取函数:
-
fread()
:读取文件(可安全用于二进制文件); -
fgets()
:从文件指针中读取一行; -
fgetc()
: 从文件指针中读取字符,从文件句柄中获取一个字符;
关闭文件:fclose()
:关闭一个已打开的文件指针;
如果不需要打开文件可以使用:
file_get_contents()
:将整个文件读入一个字符串;
file_put_contents()
:将一个字符串写入文件;
其他读取函数:
-
file()
:把整个文件读入一个数组中; -
readfile()
:输出文件,读取文件并写入到输出缓冲。
访问一个远程文件[此文件不在本地服务器上]:
- php.ini 中开启
allow_url_fopen
,(只用开启后,才能使用fopen或者file_get_contents进行远程读取),http协议连接只能使用只读模式,FTP协议可以使用只读或者只写模式;
目录相关操作:
名称相关:
-
basename()
:返回路径中的文件名部分,给出一个包含有指向一个文件的全路径的字符串,本函数返回基本的文件名。; -
dirname()
:返回路径中的目录部分,给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名。; -
pathinfo()
:返回文件路径的信息,pathinfo() 返回一个关联数组包含有 path 的信息。返回关联数组还是字符串取决于 options[第二个参数]。
目录读取:目录函数
-
opendir()
:打开目录句柄; -
readdir()
:从目录句柄中读取条目,返回目录中下一个文件的文件名。文件名以在文件系统中的排序返回。; -
closedir()
:关闭目录句柄; -
rewinddir()
:倒回目录句柄,将 dir_handle[参数] 指定的目录流重置到目录的开头。
目录删除:
-
remdir()
: 删除目录,尝试删除 dirname 所指定的目录。 该目录必须是空的,而且要有相应的权限。 失败时会产生一个 E_WARNING 级别的错误。[使用时先遍历删除清空文件,然后删除目录];
目录创建:
-
mkdir()
:新建目录,尝试新建一个由 pathname 指定的目录。
文件大小:
-
filesize()
:取得指定文件的大小;
目录大小:首先要遍历目录下的文件,然后将文件大小相加;
磁盘大小:
-
disk_free_space()
:给出一个包含有一个目录的字符串,本函数将根据相应的文件系统或磁盘分区返回可用的字节数。; -
disk_total_space()
:给出一个包含有一个目录的字符串,本函数将根据相应的文件系统或磁盘分区返回所有的字节数;
文件拷贝:
-
copy()
:拷贝文件;
文件类型:
-
filetype()
:取得文件类型,返回文件的类型。;
删除文件:
-
unlink()
:删除文件,和 Unix C 的 unlink() 函数相似。 发生错误时会产生一个 E_WARNING 级别的错误。
重命名文件和目录:
-
rename()
: 重命名一个文件或目录,也可以移动目录位置;
文件截取:
-
ftruncate()
:将文件截断到给定的长度;
文件属性:
-
file_exists()
:检查文件或目录是否存在; -
is_readalbe()
:判断给定文件名是否存在并且可读; -
is_writeable()
:判断给定的文件名是否可写,如果文件存在并且可写则返回 TRUE。filename 参数可以是一个允许进行是否可写检查的目录名。 -
filectime()
:取得文件的 inode 修改时间; -
fileatime()
:取得文件的上次访问时间; -
filemtime()
: 取得文件修改时间,本函数返回文件中的数据块上次被写入的时间,也就是说,文件的内容上次被修改的时间。 -
is_executable()
:判断给定文件名是否可执行。
其他函数:
-
flock()
:轻便的咨询文件锁定,许执行一个简单的可以在任何平台中使用的读取/写入模型; -
fseek()
: 在文件指针中定位; -
ftell()
:返回文件指针读/写的位置,返回由 handle 指定的文件指针的位置,也就是文件流中的偏移量; -
rewind()
:倒回文件指针的位置;
牢记文件操作函数以及几种打开模式,理解目录的操作步骤,练习完成目录的赋值和删除函数的编写;
练习题:
1. 通过PHP函数的方式对目录进行遍历,写出程序;
[注意:]遍历时,注意目录中子目录/文件名为0或者为空的,判断时是用 false !== 目录名
2. 不断在文件hello.txt头部写入一行"hello world" 字符串,要求代码完整
//不断在文件hello.txt头部加入一行 "hello world"
/**
* 不断的在hello.txt文件中写入 hello world
*/
$file = './hello.txt';
// 打开文件
$handle = fopen($file, 'r');
//读取文件内容
$content = fread($handle, filesize($file));
//拼接文件内容
$content = 'hello world ' . $content;
//关闭文件
fclose($handle);
//再次打开文件
$handle = fopen($file, 'w');
//将内容写入文件
fwrite($handle, $content);
//将文件关闭
fclose($handle);
//通过PHP函数的方式对目录进行遍历,写出程序
$dir = './imooc';
function loopDir($dir)
{
$handle = opendir($dir);
//读取目录下的文件,判断是否是一个目录或者是文件
while (false !== ($file = readdir($handle))){
//如果是目录,排除 .和.. 当前目录和上级目录
if ($file != '.' && $file != '..'){
//输出文件名称
echo $file . "<br>";
//如果是目录继续遍历目录
if (filetype($dir . '/' . $file) == 'dir'){
loopDir($dir . '/' . $file);
}
}
}
}
loopDir($dir);