文章目录
- 文件编程的必要性
- 目录操作
- 其它目录操作
- 递归遍历目录
- PHP5常见文件操作函数
- PHP4常见文件操作函数
- 其他文件操作函数
文件编程的必要性
文件编程指利用PHP代码针对文件(文件夹)进行增删改查操作。
在实际开发项目中,会有很多内容(文件上传、配置文件等)具有很多不确定性,不能在一开始就手动的创建,需要根据实际需求和数据本身来进行管理,这个时候就可以使用PHP文件编程来实现代码批量控制和其他操作。
文件操作的分类
1) 目录操作:文件夹,用来存放文件的特殊文件
2) 文件操作:用来存放内容
目录操作
创建目录
1.mkdir(目录名):创建成功返回true,创建失败返回false
2.创建目录可以结合错误抑制符使用。因为有些操作为的就是得到一个想要的结果,如果结果本身就存在,那么可以忽略得到过程的错误:抑制错误。
- 例如:上面想要创建的文件夹本身就存在
$res = @mkdir('dir');
删除目录
rmdir(指定文件夹路径):移出文件夹
@rmdir('dir');
读取目录
读取方式:将文件夹(路径)按照资源方式打开
1.opendir(目录名):打开资源,返回一个路径资源,包含指定目录下的所有文件(文件夹)
2.readdir(路径资源):从资源中读取指针所在位置的文件名字,然后指针下移,直到指针移出资源
- 如果想要读取所有内容,那么此时可以使用
while
或者for
进行循环操作
$r = @opendir('dir');
while($file = readdir($r))
{
echo $file,'<br/>';
}
关闭目录
closedir(路径资源)
其它目录操作
1)dirname(路径):得到的是路径的上一层路径
- 作用:可以得到路径的前缀
$dir1 = 'D:/Mango/Lemon/Test.php';
$dir2 = 'D:/Mango/Lemon/Test/test.php';
echo dirname($dir1)," ",dirname($dir2);//D:/Mango/Lemon D:/Mango/Lemon/Test
注意:dirname
只是根据字符串返回,无论该路径在电脑上是否存在
2)realPath(一个路径):如果文件存在,返回该文件路径。如果文件不存在,返回false
$dir1 = 'Z:/1.md';
$dir2 = 'Z:/2.md';
var_dump(realpath($dir1),realpath($dir2));//string(7) "Z:\1.md" bool(false)
3)is_dir(路径):判断指定路径是否是一个目录,如果该路径不存在&不是目录:返回false
$dir1 = 'D:/';
$dir2 = 'D:/Mango/Lemon/Test/test.php';
var_dump(is_dir($dir1),is_dir($dir2));//bool(true) bool(false)
4)scandir(路径):封装版的opendir+readdir+closedir,获取一个指定路径下的所有文件信息,以数组形式返回
var_dump(scandir('dir'));//array(3) { [0]=> string(1) "." [1]=> string(2) ".." [2]=> string(4) "ddir" }
递归遍历目录
递归遍历目录:指定一个目录的情况下,将其下的所有文件和目录,及其目录内部的所有内容都输出出来。
思路
- 设计一个能够遍历一层文件的函数
function my_scandir($dir)
1.首先要判断$dir是否是目录,如果不是目录,直接终止
2.使用scandir
读取dir目录下的所有内容(文件+子目录)
3.遍历读取到的所有内容
-
此时需要构造文件路径(因为遍历得到的结果只是文件的名字) & 并且需要排除
.
和..
文件,否则会导致死循环 -
找到递归点:遍历得到的文件是目录,应该调用当前函数(调用自己),判断构建好的路径是目录还是普通文件,如果是目录,则调用自身函数
4.找到递归出口:遍历完这个文件夹之后,发现没有任何子文件夹(函数不再调用自己):自带递归出口
问题:如何显示层级关系
函数第一次运行遍历的结果是最外层目录,内部调用一次说明进入一个子目录,子目录再调用一次函数进入孙子目录,如果能够在第一次调用的时候给个标记,然后在进入的时候,通过标记的变化来识别层级关系,就可以达到目的:该标记还能代表层次关系:缩进
方法:可以在函数当中多增加一个参数,默认值为0,标识最外层
- 递归调用函数的时候也需要使用该参数:但是是属于当前层级的子层,所以+1
注意:递归调用的时候,是level+1,而不是level++,因为要回溯回来,如果是++就会导致level的值发生改变
根据层级来实现缩进
可以使用str_repeat
函数,作用是:重复一个字符串多少次,在这里我们的层级用空格来表示即可
str_repeat(" ",$level))
==>重复两个空格level次
整体代码
//递归遍历目录
//参数1:路径名 参数2:当前层级,默认是0,表示最外层
function my_scandir($dir,$level = 0)
{
//1.首先判断该路径是否是一个目录,如果不是,直接结束
if(!is_dir($dir))
die($dir.'<br/>'); //die() 函数输出一条消息,并退出当前脚本。
//2.使用scandir函数获取当前路径下所有文件信息,以数组形式返回
$file_array = scandir($dir);
//3.遍历路径下的所有内容
foreach($file_array as $file)
{
//$file代表的就是文件名/文件夹名
//根据文件层级显示对应的空格数
echo str_repeat(" ",$level),$file.'<br/>';
//排除.和.. 防止死递归
if($file == '.' || $file == '..')
continue;
//因为$file只是文件名,所以要构造路径
$file_dir = $dir.'/'.$file; //利用到了 .连接符
//验证: echo $file_dir;
//如果是目录,那么就递归
if(is_dir($file_dir))
my_scandir($file_dir,$level+1);
}
}
$dir = 'dir';
my_scandir($dir);
效果
PHP5常见文件操作函数
1)file_get_contents(文件路径)
:获取指定文件的所有内容
- 如果路径不存在最好做安全处理 ==> 错误抑制
$file = 'read.txt';
$content = @file_get_contents($file);
echo $content;//hello I am read.txt Mango Lemon
2)file_put_contents(文件路径,内容)
:将指定内容写入到指定文件内:如果当前路径下不存在指定的文件,函数会自动创建(如果路径不存在,不会创建路径)
- 返回值:返回写入的字符串长度(字节)
$file = 'read.txt';
// $content = @file_get_contents($file);
$test = 'hello world';
$res = file_put_contents($file,$test);
echo $res;//11
PHP4常见文件操作函数
PHP4中是将文件操作用资源形式处理:不论是读还是写都依赖资源指针:文件内容中指针所在位置
1)fopen(文件路径,打开模式):打开一个文件资源,返回值资源指针,要指定打开模式
2)fread(资源指针,长度):从打开的资源中读取指定长度的内容(字节)
3)fwrite(资源指针,内容):向打开的资源中写入指定的内容
4)fclose(资源):关闭资源
$file_name = 'read.txt';
$fp = fopen($file_name,'r');//以读方式打开
$content = fread($fp,1024);
echo $content; //hello world hello world dwadaw dwadaw
fclose($fp);
其他文件操作函数
1)is_file():判断文件是否正确(不识别路径)
$filename = 'example.txt';
if (is_file($filename)) {
echo "The file exists and is a regular file.";
} else {
echo "The file does not exist or is not a regular file.";
}
2)filesize():获取文件大小
$filename = 'example.txt';
$filesize = filesize($filename);
echo "The size of the file is: " . $filesize . " bytes";
3)file_exists():判断文件是否存在(识别路径)
$filename = 'example.txt';
if (file_exists($filename)) {
echo "The file exists.";
} else {
echo "The file does not exist.";
}
4)unlink():取消文件名字与磁盘地址的连接(删除文件)
$filename = 'example.txt';
if (file_exists($filename)) {
unlink($filename);
echo "File deleted successfully.";
} else {
echo "File does not exist, cannot delete.";
}
5)filemtime():获取文件最后一次修改的时间
$filename = 'example.txt';
if (file_exists($filename)) {
$lastModified = filemtime($filename);
echo "Last modified: " . date("Y-m-d H:i:s", $lastModified);
} else {
echo "File does not exist.";
}
6)fseek():设定fopen打开的文件的指针位置
$filename = 'example.txt';
$fp = fopen($filename, 'r');
fseek($fp, 50); // Set the pointer position to byte 50 from the beginning of the file
// Perform other operations here, like reading or writing
fclose($fp);
7)fgetc():一次获取一个字符
$filename = 'example.txt';
$fp = fopen($filename, 'r');
$char = fgetc($fp); // Read one character from the file
echo "The first character in the file is: " . $char;
fclose($fp);
8)fgets():一次获取一个字符串(默认行)
$filename = 'example.txt';
$fp = fopen($filename, 'r');
$line = fgets($fp); // Read one line from the file
echo "The first line in the file is: " . $line;
fclose($fp);
9)file():读取整个文件,类似file_get_contents,区别是按行读取,返回一个数组
$filename = 'example.txt';
$lines = file($filename); // Read the entire file into an array
foreach ($lines as $line) {
echo $line . "<br>";
}