风之旅人 Android Dev Engineer

14.PHP文件操作

2019-10-25
PHP

文件编程

目录操作

创建目录

mkdir (路径名字):创建成功返回true,创建失败返回false

//创建目录
$res = @mkdir('ceshi');
var_dump($res);

🐖 $res = mkdir('ceshi'); 再次创建会报错,加入 '@' 后可以起到抑制错误的作用

删除目录

rmdir (指定文件夹路径):移出文件夹 @rmdir('ceshi');

读取目录

读取方式:将文件夹(路径)按照资源方式打开

  1. opendir():打开资源,返回一个路径资源,包含指定目录下的所有文件(文件夹)
  2. readdir():从资源中读取指针所在位置的文件名字,然后指针下移,直到指针移出资源
  3. 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

其他目录操作

  1. dirname(一个路径):得到的是路径的上一层路径
  2. realpath(真实路径):得到真实路径(绝对路径),php5中如果是文件则返回 false
  3. is_dir():判断指定路径是否是一个目录,如果是文件那么得到的结果是false
  4. 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

递归遍历目录:指定一个目录的情况下,将其下的所有文件和目录,及其目录内部的所有内容都输出出来。

递归算法:将大问题切成相似的小问题(最小单位),然后可以调用解决大问题的方法来解决小问题。

递归遍历目录的思维逻辑

  1. 设计一个能够遍历一层文件的函数
  2. 找到递归点 :遍历得到的文件是目录,应该调用当前函数(调用自己)
  3. 找到递归出口 :遍历完这个文件夹之后,发现没有任何子文件夹(函数不再调用自己):自带递归出口
  4. 如何显示层级关系?函数第一次运行遍历的结果是最外层目录,内部调用一次说明进入一个子目录,子目录再调用一次函数进行孙子目录…如果能够在第一次调用的时候给个标记,然后在进入的时候,通过标记的变化来识别层级关系,就可以达到目的:该标记还能代表层次关系:缩进
//递归遍历文件夹
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("&nbsp;&nbsp;",$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常见文件操作函数

  1. file_get_contents(文件路径):获取指定文件的所有内容,如果路径不存在最好做安全处理
//🌈读取内容,类似 Linux 的 cat 命令
echo '<pre>';
$file = 'temp.php';
$content = @file_get_contents($file);
var_dump($content);
🍎
string(230) "首页 -
HTML 教程 -
CSS 教程 -
JavaScript 教程 -
PHP 教程';
?>"
  1. file_put_contents(文件路径,内容):将指定内容写入到指定文件内:如果当前路径下不存在指定的文件,函数会自动创建(如果路径不存在,不会创建路径)
//写入内容,覆盖掉之前的内容...
$file = 'temp.php';
$text = 'hello world';
$res = file_put_contents($file,$text);
var_dump($res);// int(11)

PHP4常见文件操作函数

PHP4中是将文件操作用资源形式处理:不论是读还是写都依赖资源指针:文件内容中指针所在位置。

  1. fopen(文件路径,打开模式):打开一个文件资源,限定打开模式
  2. fread(资源,长度):从打开的资源中读取指定长度的内容(字节)
  3. fwrite(资源,内容):向打开的资源中写入指定的内容
  4. 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

其他文件操作函数

  1. is_file():判断文件是否正确(不识别路径)
  2. filesize():获取文件大小
  3. file_exists():判断文件是否存在(识别路径)
  4. unLink():取消文件名字与磁盘地址的连接(删除文件)
  5. filemtime():获取文件最后一次修改的时间
  6. fseek():设定fopen打开的文件的指针位置
  7. fgetc():一次获取一个字符
  8. fgets():一次获取一个字符串(默认行)
  9. file():读取整个文件,类似 file_get_contents,区别是按行读取,返回一个数组

文件下载

文件下载:从服务器将文件通过HTTP协议传输到浏览器,浏览器不解析保存成相应的文件。 提供下载方式可以使用HTML中的a标签:点击下载

🔥 缺点

  1. a标签能够让浏览器自动下载的内容有限:浏览器是发现如果解析不了才会启用下载
  2. a标签下载的文件存储路径会需要通过href属性写出来,这样会暴露服务器存储数据的位置 (不安全)

PHP下载:读取文件内容,以文件流的形式传递给浏览器:在响应头中告知浏览器不要解析,激活下载框实现下载。

  1. 指定浏览器解析字符集
  2. 设定响应头
    • 设定文件返回类型:image/jpg||application/octem-stream
    • 设定返回文件计算方式:Accept-ranges:bytes
    • 设定下载提示:Content-disposition:attachment;filename=文件名字
    • 设定文件大小:Accept-length:文件大小(字节)
  3. 读取文件
  4. 输出文件 方案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);


相关文章

下一篇 15.PHP会话技术

评论