PHP进行文件和目录操作,熟悉PHP的文件管理系统。
PHP的目录与文件操作与Linux中的终端命令操作很相似,但都是以函数形式进行的操作
这里将分为目录操作与文件操作两类进行总结
目录操作
1.创建新目录mkdir()
在指定的路径创建一个新的目录操作。函数有三个参数
- 第1参数:路径及目录名称
- 第2参数:目录访问权限
- 第3参数:bool,上层目录不存在时,是否递归创建
$dirname = "./public/a/b/c/d"; // "./"是在当前路径下创建
mkdir($dirname,0777,true);
这里的第二个参数是八进制的表示文件权限的mode,windows下会弱化文件权限的特点,所以这里将类比Linux进行文件访问权限的介绍。
PS.文件访问权限简介
文件权限分为3类
- 可读
- 可写
- 可执行
由3位二进制来表示,0代表否,1代表是。
而3位二进制,从左往右依次代表,读权限,写权限,执行权限。
eg. 111 就是文件的最高权限,可读、可写、可执行,对应二进制转换为10进制就是7
101 对应的文件权限就是,可读、不可写、可执行,对应的二进制转换为5
以此类推
访问限制由由3类使用者组成
- 所有者(用户)
- 所有者所在的组
- 全部用户
文件访问权限是由3位八进制数字来表示当前文件相应用户的使用权限。
每一个八进制数字就是文件权限转换为十进制的数字。
代表着对应不同使用者的权限,从左往右依次是,文件创建用户,用户所在组,所有用户。
eg. 777 每一位都是最高权限,及当前文件,所有者 可读可写可执行,所有者所在组 可读可写可执行,全部用户 可读可写可执行。
755 的权限就为:所有者 可读可写可执行,所有者所在组 可读不可写可执行,全部用户 可读不可写可执行
2.判断是目录is_dir(),目录文件是否存在file_exists()
这两个函数经常一起使用。is_dir()判断当前字符串是否是一个目录,file_exists()判断当前文件是否存在。
$dirname = "./path";
if(file_exists($dirname))
{
echo "{$dirname}文件存在!";
if(is_dir($dirname))
{
echo "{$dirname}是一个目录";
}
else
{
echo "{$dirname}不是一个目录";
}
}
else
{
echo "{$dirname}文件不存在!";
}
3.删除目录rmdir()
rmdir($path)只能删除空目录,如果目录中有其他文件,则删除失败。$dirname = "./path";
if(file_exists($dirname))
{
if(is_dir($dirname))
{
rmdir($dirname);
}
}
4.更改目录访问权限chmod()
chmod($path,$mode),改变文件访问权限。访问权限简介见 PS.文件访问权限简介
$dirname = "./path";
chmod($dirname,0444); //将所有用户的权限都设为只读
注意:因为windows对文件权限功能进行了弱化,所以windows最终输出的权限可能有输入的权限不相同。
5.取得文件的访问权限fileperms()
fileperms()以 十进制返回当前文件的权限。$dirname = "./path";
$mode = fileperms($dirname);
$mode = decoct($mdoe); //将十进制转换为8进制
substr($mode,-4); //从后往前第四个数开始截取数字
6.重命名或移动文件rename()
rename($oldname,$newname),使用很简单但是注意
如果原路径与新路径在一个目录下,则认为是改名
如过原路径与新路径不再一个目录下,则认为是移动操作
7.打开目录opendir()
用目录句柄接受打开的目录,参数为文件路径。$dirname = "./path";
//打开目录,成功返回文件句柄,失败返回FALSE
$handle = opendir($dirname);
8.读取文件中条目readdir()
从目录句柄中读取条目,参数为目录句柄。$dirname = "./path";
//打开目录,成功返回文件句柄,失败返回 FALSE
$handle = opendir($dirname);
//每次循环指向下一个条目,直到所有条目读完,返回 FALSE
while($line = readdir($handle))
{
echo $line();
}
9.文件名字符编码转换iconv()
将字符串按要求的字符编码来转换。参数为,输入的字符集,输出的字符集,要转换的字符串
while($line = readdir($handle))
{
echo iconv('gbk','utf-8',$line);
}
windows操作系统的字符编码是GBK或GB2312,而通常网页的编码是UTF-8
10.关闭目录句柄closedir()
关闭指定目录流,释放资源,参数为目录句柄$handle。文件操作
1.打开文件fopen()
可以打开文件或URL,fopen($filename , $mode),$filename指定打开的目标文件或URL,$mode文件打开方式文件打开方式 | 含义 |
---|---|
"r"只读 | 输入数据,打开一个已经存在的文件 |
“r+读写 | 读和写,打开一个文件 |
"w"只写 | 输出数据,打开一个文件 |
“w+”写读 | 读和写,打开一个文件 |
“a”追加 | 写入打开,文件指针指向末尾 |
“a+读写 | 读写打开,文件指针指向末尾 |
2.关闭文件fclose()
关闭已打开的文件指针3.读取文件内容fread()
读取文件(可用于二进制文件),fread($handle,$length),$handle打开文件时的文件句柄,$length最多读取的字节数读取图片为例
$filename = "./img.png";
$handle = fopen($filename,'rb')//图片,视频,音频,全是二进制文件
$fout = fread($handle,filesize($filename));
header("Content-Type:image");
echo $fout;
fclose($handle);
4.读取一行内容fgets()
从文件指针中读取一行,fgets($handle,$length),$handle是文件指针,$length从文件中读取一行,并返回长度最多为length-1字节的字符串,可以不指定值,默认为1k读取文本文档为例
$filename = "./1.txt";
$handle = fopen($filename,'r');
while($str = fgets($handle))
{
echo iconv('gbk','utf-8',$str);
}
循环读取所有行的数据,碰到换行符、文件结束符终止读取,操作系统默认字符集为“gbk”,而网页默认字符集为“utf-8”,所以需要字符集转换
5.读取文件内容到数组file()
将整个文件读入到一个数组中 ,可以不用创建文件的句柄,第一个参数为文件路径或网页URL。第二参数为附件选项
- FILE_USE_INCLUDE_PATH(1):在include_path查找文件;
- FILE_IGNORE_NEW_LINES(2):在数组的每个元素末尾不添加换行符
- FILE_SKIP_EMPTY_LINES(4):跳过空行
1,2,4分别代表20,21,22
打开新浪新闻为例
$filename = "https://news.sina.com.cn/";
$arr = file($filename,2|4);
print_r($arr);
返回的结果,网页的每一个标签都是数组中的一个元素
6.写入文件fwrite()
写入文件,fwrite($handle,$string) $string为需要写入的字符串$filename = "./1.txt"
$handle = fopen($filename,'a');
$str = "ABCDE\r\n";
fwrite($handle,$str);
fclose($handle);
写入中文字符时,注意字符集转换
7.拷贝文件copy()
copy($old,$new),参数分别代表文件的路径,和要拷贝到的路径及副本名称$old = "./1.txt";
$new = "./2.txt";
copy($old,$new);
8.删除文件unlink()
返回布尔值,成功时返回TRUE,失败是返回FALSE其他文件操作函数
函数 | 功能 |
---|---|
filesize() | 以字节为单位获取文件大小 |
is_writable() | 判断文件是否可写 |
is_readable() | 判断文件是否可读 |
feof() | 判断文件指针是否到达文件结尾 |
filectime() | 获取创建文件的时间 |
fileatime() | 获取文件最新访问时间 |
filemtime() | 获取文件最后修改时间 |