文件编程
目录操作
mkdir(路径名) //创建文件,成功返回true,失败返回false
删除目录
rmdir(文件名) //删除文件夹
读取目录
将文件夹(路径)按照资源方式打开
opendir(); //打开资源,包含指定目录下的所有文件
readdir(); //从资源中读取执政所在位置的文件名字,然后指针下移,直到移除资源
关闭目录(资源)
closedir(); //关闭资源
其他操作
dirname(路径); //得到上层目录
realpath(路径); //得到真实路径(目录路径)
id_dir(路径); //判断指定文件是否是路径
scandir(); //获取一个路径下的所有文件信息,相当于封装版的opendir/readdir/colsedir,以数
//形式返回
递归遍历目录
在指定一个目录的情况下,将其下的所有文件,及其目录内部的所有内容都输出出来
递归算法:将大问题切成相似的小问题(最小单位),然后调用解决大问题的方法解决小问题
函数封装:函数如果能够自己内部调用自己,则该函数称之为递归函数
案列
<?php
/*
1.设计一个能够遍历一层文件的函数
2.找到递归点,文件遍历得到的是文件目录,应该调用当前函数(调用自己)
需要构造路径(遍历得到的结果只是文件的名字)
需要排除.和..
3.找到递归出口,遍历完文件夹之后没有任何子文件夹(函数不再调用自己)
*/
//递归遍历文件夹
//定义路径
$dir = 'directory';
//创建函数:能够访问指定路径下的所有文件,并且还能判断目录是文件
function my_scandir($dir){
//保证文件安全,不是路径没有必要往下,是路径才遍历
if(!is_dir($dir))
die($dir).'<br/>';
//读取全部内容,遍历输出
$files = scandir($dir);
foreach($files as $file){ //$files是目录,$file是文件名
// echo $file.'<br>';
//排除.和..
if($file == '.'||$file =='..') continue; //continue从新循环,代码不再向下执行
//构造路径
$file_dir = $dir.'/'.$file;
echo $file_dir.'<br/>';
}
//判断路径
if(is_dir($file_dir)){
//递归点
my_scandir($file_dir); //遍历结束后就没有内容(没有文件夹),相当于自带递归出口
}
}
my_scandir($dir);
?>
文件操作
file_get_contents(文件路径); //获取指定文件的所有内容
file_put_contents(文件路径,内容); //将指定内容写入指定文件内,如果文件不存在则自动创建文件
//路径不存在则不能创建
常见文件操作函数
foprn():打开一个文件资源
fread():从打开资源中读取指定长度的内容(字节)
fwrite():向打开资源中写入指定内容
fclose():关闭资源
其他函数
is_file():是否为文件
filesize():获取文件大小
file_exists():判断文件是否存在
unlink():取消文件名字与磁盘地址连接(删除文件)
filemtime():获取文件最后一次修改的时间
文件下载
从服务器将文件通过http协议传输到浏览器,浏览器不解析保存成相应的文件。
提供下载的方式:<a href="文件路径"></a>
缺点:a标签能够让浏览器自动下载的内容有限,浏览器发现如果解析不了的文件才会启用下载;a标签下载的文件存储路径需要通过href属性显示,会暴露服务器存储数据的位置(不安全)
php下载
读取文件内容,以文件流的形式传递给浏览器,并在响应头中告知浏览器不要解析,激活下载框,实现下载
案例:
<?php
//PHP文件下载
//设定解析字符集
$file = 'a.txt';
header('Content-type:text/html;charset = utf-8');
//设定响应头, 以文件流形式传输数据
header('Conten-type:application/octem-strem');
header('Accepr-ranges:bytes'); //以字节的方式计算
header('Content-dispositino:attachment;filename='.$file);
header('Accept-length:'.filesize($file));
$f = @fopen($file,'r') or die();
//方案一 直接读然后输出
while($row = fread($f,1024)){
echo $row;
}
//方案二 判定是否可读,然后再读
while(!feof($f)){
echo fread($f,1024);
}
//关闭资源
fclose($f);
?>