一.文件的读取相关函数
<?php
/**
* 文件操作的基本过程
* 1. 打开文件
* 2. 操作文件:读写追加等
* 3. 关闭文件
*/
// 1.创建或打开一个本地文件
//以r(只读)方式打开文件,不会创建新文件, 类似: r+(读写),指针在开头
// $fh = fopen('file1.txt', 'r') or die("不能打开file1.txt文件");
$fh = fopen('maxim.txt', 'r') or die("不能打开file1.txt文件");
// 以w(只写)方式打开文件,如文件不存在则创建, 类似: w+(读写),指针在开头
$fh = fopen('file2.txt', 'w') or die("不能打开file2.txt文件");
// 以a(追加只写)方式打开文件,如文件不存在则创建, 类似: a+(追加读写),指针在未尾
$fh = fopen('file3.txt', 'a') or die("不能打开file3.txt文件");
// 注: 在windows机器上建议读写模式符添加b,以增强对二进制文件的兼容性,如rb,wb...
// 2.打开一个远程文件
$fh = fopen('http://www.php.cn/course/801.html', 'r');
// 3.读取文件到浏览器
// 从文件指针处读取一行并自动下移
while ($s = fgets($fh)) {
print $s;
}
// fgetss()可过滤掉所有的html标签
while ($s = fgetss($fh)) {
print $s;
}
// 4. 读取文件到字符串:
// file_get_contens($filename)返回字符串
$content = file_get_contents('file.txt');
// 将整个页面读入到一个字符串,这在抓取其它网站内容时很有用,配合过滤正则
$content = file_get_contents('http://www.php.cn');
echo '文件大小: '.strlen($content).' 字节', '<br>';
if (strlen($content) > 0) {
echo $content;
}
//5. 把整个文件读入到数组中,用换行符进行分割
$arr = file('maxim.txt');
foreach ($arr as $key => $value) {
echo '<span style="color:red">格言'.($key+1).': </span>'.$value.'<hr>';
}
// shuffle($arr),随机打乱一个数组,返回true/false
if (shuffle($arr)) {
echo current($arr); //随机显示一条格言
echo $arr[0]; //随机显示一条格言
}
echo '<hr>';
array_rand($arr,$length=1):从数组随机取出一个或多个元素
//取出一个只返回键名,多个则返回随机键名数组
// echo $arr[array_rand($arr)];
print_r(array_rand($arr,3));//返回三个随机的键名
echo '<hr>';
// 遍历这个键名数组,查询出对应的数组元素值
$kes = array_rand($arr,3);
foreach ($kes as $value) { //键名无意义,我们只关心值,即键名
print $arr[$value].'<hr>';
}
//文件读写完成后,应该及时关闭
fclose($fh);
//关闭脚本后,文件也会自动关闭,但还是强烈推荐手工显示式关闭,这是一个好习惯点击 "运行实例" 按钮查看在线实例
二:目录遍历操作:
<?php
/**
* 目录遍历操作:
* 1. 传统过程函数: opendir(),readdir(),closedir()
* 2. 目录扫描器: scandir()
*/
/**
* 第一种方式: 传统目录函数
*
* 第一步: opendir('目录')打开目录,成功返回资源,失败返回false
* 第二步: readdir($dir)读取目录内容,世功返回文件名,失败返回false
* 第三步: closedir($dir)关闭当前目录
*
*/
$dir = opendir('../0827') or die('打开失败');
// $dir = opendir('./') or die('打开失败'); //.或./当前目录
while (false != ($file = readdir($dir))) {
// print $file."<br>";
// print nl2br($file."\n");
if ($file != "." && $file != "..") {
print $file."<br>";
}
}
closedir($dir);
echo '<hr>';
/***********************************************************/
/**
* 第二种方式:将目录内容保存到数组中进行遍历
* 第一步:scandir($dir)将目录转数组中保存
* 第二步:遍历目录数组
*/
//读到一个目录内容到数组中:
$fileArr = scandir('../0827/');
// print_r($fileArr);
foreach ($fileArr as $file) {
if ($file != "." && $file != "..") {
echo "$file<br>";
}
}
//说明: 如果想要递归所有目录,要编写自定义函数来解决,我们介绍一种更方便的递归遍历技术点击 "运行实例" 按钮查看在线实例
三:分解文件名
<?php //1.分解文件名 //系统常量__FILE__ echo __FILE__,'<br>'; //1.获取文件名 echo '文件名: '.basename(__FILE__).'<br>'; //2.获取目录名 echo '目录名: '.dirname(__FILE__).'<br>'; //php5.3+推荐使用常量__DIR__代替dirname() echo __DIR__, '<br>'; //3.pathinfo():将目录名,文件名,扩展或解析到一个数组中 $pathinfo = pathinfo(__FILE__); echo '目录名:', $pathinfo['dirname'],'<br>'; echo '文件名:', $pathinfo['basename'],'<br>'; echo '扩展名:', $pathinfo['extension'],'<br>'; //php中没有提供将这三个部分组成一个完整文件名的函数 //因为windows与unix上的目录分隔符不同 //windows是正斜线:/ , unix/linux上的是反斜线\ //所以系统提供一个常量:DIRECTORY_SEPARATOR,可以根据系统自动确定路径分隔符类型 $path = dirname(__FILE__).DIRECTORY_SEPARATOR.basename(__FILE__); echo $path,'<br>'; var_dump($path==__FILE__); //此晚, $path与__FILE__完全相同
点击 "运行实例" 按钮查看在线实例
//输出结果
D:\phpStudy\WWW\phpcn\demo3.php
文件名: demo3.php
目录名: D:\phpStudy\WWW\phpcn
D:\phpStudy\WWW\phpcn
目录名:D:\phpStudy\WWW\phpcn
文件名:demo3.php
扩展名:php
D:\phpStudy\WWW\phpcn\demo3.php
D:\phpStudy\WWW\phpcn\demo3.php:29:boolean true
四.文件的几个操作函数
<?php
//删除文件:unlink(file)
unlink('temp.php') or die ('删除失败');
//复制copy(old, new)
copy('maxim.txt', '../0419/maxim01.txt') or die('复制失败');
//更名:rename(old,new):二个参数在同一目录下
rename('maxim01.txt', 'maxim02.txt') or die('移动失败');
//移动:rename(old,new):二个参数在不同的目录下
rename('file3.txt', __DIR__.'/../0418/file3.txt') or die('移动失败');
rename('file2.txt', '../0418/file2.txt') or die('移动失败');
//创建目录: mkdir(dirname)
mkdir('admin');
// rename('file.txt', 'admin/file.txt') or die('移动失败');
//删除目录
//先清空目录
// unlink('admin/file.txt');
rmdir('admin');点击 "运行实例" 按钮查看在线实例
五.文件的上传操作
系统变量: $_FILES是一个二维数组,一维是当前的文件上件控件的名称,就是name属性值
二维是它的当前属性,最重要的有以下几个:
$_FILES['file']['name']: 文件原始名称
$_FILES['file']['type']: 文件类型
$_FILES['file']['size']: 上传的文件大小
$_FILES['file']['tmp_name']: 服务器上的临时文件夹
$_FILES['file']['error']: 上传错误代码
<!-- $_SERVER['PHP_SELF']:当前php脚本 -->
<!-- enctype="multipart/form-data" :允许通过表单上传文件-->
<!-- method:请求类型必须是POST -->
<!--
处理脚本的三种语法:
1. 最严格的写法:$_SERVER['PHP_SELF']:建议实际工作中用htmlspecialchars()进行防跨域攻击处理
2. 最死板的写法,直接写上当前文件名: demo6.php
3. 最懒的写法: 空,啥与不写,默认就是提交到当前页面的php脚本处理
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="POST" enctype="multipart/form-data">
<!-- 用隐藏域设置允许上传的文件大小,仅考参考 -->
<input type="hidden" name="MAX_FILE_SIZE" value="542488">
<fieldset>
<legend align="center">文件上传</legend>
<p><strong>选择文件:</strong><input type="file" name="upload"></p>
</fieldset>
<p align="center"><button type="submit" name="submit" >上传</button></p>
</form>
<?php
//检测请求类型是否POST,如果不是应该提示用户类型不对
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
//检测是否有文件被上传
if (isset($_FILES['upload'])) {
//设置允许上传的文件类型
$allow = ['image/jpg','image/jpeg', 'image/png'];
if (in_array($_FILES['upload']['type'], $allow)) {
//将文件先移动到临时目录
if (move_uploaded_file($_FILES['upload']['tmp_name'], "upload/{$_FILES['upload']['name']}")){
//上传成功
echo "<script>alert('文件上传成功')</script>";
}
}else {
//提示格式不对
echo "<script>alert('仅允许上传jpg和png格式的图片')</script>";
}
}
//对上传错误进行处理
if ($_FILES['upload']['error'] > 0 ) {
echo '<p>错误原因是:<strong>';
switch ($_FILES['upload']['error']) {
case 1:
echo '文件超过了php.ini配置中设置的大小';
break;
case 2:
echo '文件超过了表单中常量设置的大小';
break;
case 3:
echo '仅有部分文件被上传';
break;
case 4:
echo '没有文件被上传';
break;
case 6:
echo '没有可用的临时文件夹';
break;
case 7:
echo '磁盘已满,写入失败';
break;
case 8:
echo '上传意外中止';
break;
default:
echo '系统未知错误';
break;
}
echo '</strong></p>';
//保险起见,最好把创建的临时文件删除,当然系统也会在结束会话时自动清空
if (file_exists($_FILES['upload']['tmp_name']) && is_file($_FILES['upload']['tmp_name'])) {
unlink($_FILES['upload']['tmp_name']);
}
}
} else {
echo '1';
}
?>点击 "运行实例" 按钮查看在线实例
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号