文件编程
目录操作
创建目录
mkdir (路径名字):创建成功返回true,创建失败返回false
//创建目录
$res = @mkdir('ceshi');
var_dump($res);
🐖 $res = mkdir('ceshi'); 再次创建会报错,加入 '@' 后可以起到抑制错误的作用
删除目录
rmdir (指定文件夹路径):移出文件夹 @rmdir('ceshi');
读取目录
读取方式:将文件夹(路径)按照资源方式打开
- opendir():打开资源,返回一个路径资源,包含指定目录下的所有文件(文件夹)
- readdir():从资源中读取指针所在位置的文件名字,然后指针下移,直到指针移出资源
- closedir() :关闭资源
🌰读取所有内容:遍历操作
echo '<pre>';
//读取目录
$r = opendir('uploads');
var_dump($r);
//读取资源 , 循环遍历输出
while($file = readdir($r)){
echo $file,'<br/>';
}
//关闭资源
closedir($r);
🍎
resource(3) of type (stream)
.
..
Chrysanthemum.jpg
file
image
image201720172017201708081414OXEF.jpg
Koala.jpg
Lighthouse.jpg
Penguins.jpg
其他目录操作
- dirname(一个路径):得到的是路径的上一层路径
- realpath(真实路径):得到真实路径(绝对路径),php5中如果是文件则返回 false
- is_dir():判断指定路径是否是一个目录,如果是文件那么得到的结果是false
- scandir():封装版的 opendir\readdir\closedir,获取一个指定路径下的所有文件信息,以数组形式返回
//目录操作
echo '<pre>';
//其他函数
$dir1 = 'C:\fastwork\Apache24\htdocs';
$dir2 = 'C:\fastwork\Apache24\NOTICE.txt';
var_dump(dirname($dir1),dirname($dir2));
var_dump(realpath($dir1),realpath($dir2));
var_dump(is_dir($dir1),is_dir($dir2));
//遍历文件夹
var_dump(scandir('uploads'));
🍎
//dirname
string(20) "C:\fastwork\Apache24"
string(20) "C:\fastwork\Apache24"
//realpath
string(27) "C:\fastwork\Apache24\htdocs"
string(31) "C:\fastwork\Apache24\NOTICE.txt"
//is_dir
bool(true)
bool(false)
//scandir
array(9) {
[0]=>
string(1) "."
[1]=>
string(2) ".."
[2]=>
string(17) "Chrysanthemum.jpg"
[3]=>
string(9) "Koala.jpg"
[4]=>
string(14) "Lighthouse.jpg"
[5]=>
string(12) "Penguins.jpg"
[6]=>
string(4) "file"
[7]=>
string(5) "image"
[8]=>
string(37) "image201720172017201708081414OXEF.jpg"
}
递归遍历目录👉Video
递归遍历目录:指定一个目录的情况下,将其下的所有文件和目录,及其目录内部的所有内容都输出出来。
递归算法:将大问题切成相似的小问题(最小单位),然后可以调用解决大问题的方法来解决小问题。
递归遍历目录的思维逻辑
- 设计一个能够遍历一层文件的函数
- 找到递归点 :遍历得到的文件是目录,应该调用当前函数(调用自己)
- 找到递归出口 :遍历完这个文件夹之后,发现没有任何子文件夹(函数不再调用自己):自带递归出口
- 如何显示层级关系?函数第一次运行遍历的结果是最外层目录,内部调用一次说明进入一个子目录,子目录再调用一次函数进行孙子目录…如果能够在第一次调用的时候给个标记,然后在进入的时候,通过标记的变化来识别层级关系,就可以达到目的:该标记还能代表层次关系:缩进
//递归遍历文件夹
echo '<pre>';
//定义路径
$dir = 'uploads';
/*
* 创建函数:能够访问指定路径下的所有文件,且判断出目录还是文件
* @param1 string $dir,指定路径
* @param2 int $level = 0,层级,默认顶层
*/
function my_scandir($dir,$level = 0){
//保证文件安全:如果不是路径没有必要往下
if(!is_dir($dir))die($dir . '<br/>');
//读取全部路径信息,遍历输出
$files = scandir($dir);
foreach($files as $file){
//$file就是一个个文件名
//根据层级来实现缩进:str_repeat()
echo str_repeat(" ",$level),$file . '<br/>';
//排除.和..
if($file == '.' || $file == '..') continue;
//构造路径
$file_dir = $dir . '/' . $file;
//echo $file_dir . '<br/>';
//判断路径
if(is_dir($file_dir)){
//递归点
//$level+1 进入子层级
my_scandir($file_dir,$level+1);
}
}
}
//测试
my_scandir($dir);
🍎
.
..
Chrysanthemum.jpg
Koala.jpg
Lighthouse.jpg
Penguins.jpg
file
.
..
01.php
son
.
..
son_readme.txt
image
.
..
没图啊.txt
image201720172017201708081414OXEF.jpg
文件操作
PHP5常见文件操作函数
- file_get_contents(文件路径):获取指定文件的所有内容,如果路径不存在最好做安全处理
//🌈读取内容,类似 Linux 的 cat 命令
echo '<pre>';
$file = 'temp.php';
$content = @file_get_contents($file);
var_dump($content);
🍎
string(230) "首页 -
HTML 教程 -
CSS 教程 -
JavaScript 教程 -
PHP 教程';
?>"
- file_put_contents(文件路径,内容):将指定内容写入到指定文件内:如果当前路径下不存在指定的文件,函数会自动创建(如果路径不存在,不会创建路径)
//写入内容,覆盖掉之前的内容...
$file = 'temp.php';
$text = 'hello world';
$res = file_put_contents($file,$text);
var_dump($res);// int(11)
PHP4常见文件操作函数
PHP4中是将文件操作用资源形式处理:不论是读还是写都依赖资源指针:文件内容中指针所在位置。
- fopen(文件路径,打开模式):打开一个文件资源,限定打开模式
- fread(资源,长度):从打开的资源中读取指定长度的内容(字节)
- fwrite(资源,内容):向打开的资源中写入指定的内容
- fclose(资源):关闭资源
echo '<pre>';
$file = 'temp.php';
//打开文件资源:确定操作模式
$f = fopen($file,'r');
var_dump($f);
//读取内容
//$string = fread($f,10);
$string = fread($f,filesize($file));
echo $string;
//写操作对比
$f1 = fopen('temp.php','w');
//写入内容
fwrite($f1,'hello');
//关闭资源
fclose($f);
fclose($f1);
🍎
resource(3) of type (stream)
aaaaaaaaaaaaaa
hello world
end
其他文件操作函数
- is_file():判断文件是否正确(不识别路径)
- filesize():获取文件大小
- file_exists():判断文件是否存在(识别路径)
- unLink():取消文件名字与磁盘地址的连接(删除文件)
- filemtime():获取文件最后一次修改的时间
- fseek():设定fopen打开的文件的指针位置
- fgetc():一次获取一个字符
- fgets():一次获取一个字符串(默认行)
- file():读取整个文件,类似
file_get_contents
,区别是按行读取,返回一个数组
文件下载
文件下载:从服务器将文件通过HTTP协议传输到浏览器,浏览器不解析保存成相应的文件。 提供下载方式可以使用HTML中的a标签:点击下载
🔥 缺点
- a标签能够让浏览器自动下载的内容有限:浏览器是发现如果解析不了才会启用下载
- a标签下载的文件存储路径会需要通过href属性写出来,这样会暴露服务器存储数据的位置 (不安全)
PHP下载:读取文件内容,以文件流的形式传递给浏览器:在响应头中告知浏览器不要解析,激活下载框实现下载。
- 指定浏览器解析字符集
- 设定响应头
- 设定文件返回类型:
image/jpg||application/octem-stream
- 设定返回文件计算方式:
Accept-ranges:bytes
- 设定下载提示:
Content-disposition:attachment;filename=文件名字
- 设定文件大小:
Accept-length:文件大小(字节)
- 设定文件返回类型:
- 读取文件
- 输出文件
方案1:如果文件较小,可以使用PHP5的文件函数操作:
file_get_contents
方案2:文件比较大(网络不好),可以使用PHP4 的文件操作方式:一次读一点
🌰PHP文件下载
//设定解析字符集
header('Content-type:text/html;charset=utf-8');
$file = '故事.mp3';
//设定下载响应头
header('Content-type:image/jpg||application/octem-stream'); //以文件流形式传输数据给浏览器
header('Accept-ranges:bytes'); //以字节方式计算
header('Content-disposition:attachment;filename=' . $file); //附件下载,指定命名
header('Accept-length:' . filesize($file));
//如果文件的名字是从文件夹读取出来,而且存在中文,那么如果直接使用名字作为下载名字会出现乱码
//出现这种情况需要进行字符集转码:从GBK转成UTF-8:$file = iconv('GBK','UTF-8',$file);
//输出文件
//php5:小文件
//🐖当文件过大时,会读很长时间,导致安全问题
//echo file_get_contents($file);
//php4:大文件
$f = @fopen($file,'r') or die();
//方案1:直接读,然后输出
//🐵一次读取 1024字节(B)
while($row = fread($f,1024)){
echo $row;
}
//方案2:判定是否可读,然后再读
/*
while(!feof($f)){
echo fread($f,1024);
}*/
//关闭资源
fclose($f);