第六章 目录与文件
一.目录操作
basename — 返回路径中的文件名部分
dirname — 返回路径中的目录部分
pathinfo — 返回文件路径的信息
realpath — 返回规范化的绝对路径名
- <?php
- $path = 'demo1.php';
- $path = realpath($path);
- echo basename($path);
- echo '<br>';
- echo dirname($path);
- echo '<br>';
- $array_path = pathinfo($path);
- echo 'basename : '.$array_path['basename'].'<br>';
- echo 'dirname : '.$array_path['dirname'].'<br>';
- echo 'extension : '.$array_path['extension'].'<br>';
- echo 'filename : '.$array_path['filename'].'<br>';
- ?>
Output:
- demo1.php
- D:\AppServ\www\Basic6
- basename : demo1.php
- dirname : D:\AppServ\www\Basic6
- extension : php
- filename : demo1
二.磁盘、目录和文件计数
1.查看文件大小和磁盘空间
filesize — 取得文件大小
disk_free_space — 返回目录中的可用空间
disk_total_space — 返回一个目录的磁盘总大小
- <?php
- $path ='demo2.php';
- $path = realpath($path);
- $drive = 'c:';
- echo round(filesize($path)/1024,2).'kb'.'<br/>';
- echo round(disk_free_space($drive)/1024/1024/1024,2).'GB'.'<br/>';
- echo round(disk_total_space($drive)/1024/1024/1024,2).'GB'.'<br/>';
- ?>
output
- 0.26kb
- 10.61GB
- 30.01GB
2.获得文件的各种时间
fileatime — 取得文件的上次访问时间
filectime — 取得文件的 inode 修改时间
filemtime — 取得文件修改时间
- <?php
- $file = realpath ( '../Basic5/demo3.php' );
- $date_format = 'Y-m-d h:i:s';
- echo 'lastest accessing time : '.date ( $date_format, fileatime ( $file ) ) . '<br>';
- echo 'lastest change time : '.date ( $date_format, filectime ( $file ) ) . '<br>';
- echo 'lastest modify time : '.date ( $date_format, filemtime ( $file ) ) . '<br>';
- ?>
output
- lastest accessing time : 2011-12-18 04:26:49
- lastest change time : 2011-12-18 04:26:49
- lastest modify time : 2011-12-18 04:29:15
三.文件处理
文件读写的两种方式:
1.php所有版本都支持的方法:
fopen — 打开文件或者 URL
fclose — 关闭一个已打开的文件指针
fwrite — 写入文件(可安全用于二进制文件)
表 1. fopen() 中 mode的可能值列表
mode | 说明 |
---|---|
'r' | 只读方式打开,将文件指针指向文件头。 |
'r+' | 读写方式打开,将文件指针指向文件头。 |
'w' | 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 |
'w+' | 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 |
'a' | 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 |
'a+' | 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 |
'x' | 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE ,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。 |
'x+' | 创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE ,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。 |
- <?php
- $fp = fopen('file1.txt','w');
- $outStr = "my name is anllin,\r\nmy age is 29.";
- fwrite($fp,$outStr,strlen($outStr));
- fclose($fp);
- ?>
output
- my name is anllin,
- my age is 29.
2.php5新加入的方法
file_put_contents — 将一个字符串写入文件
- <?php
- file_put_contents('file2.txt',"my name is anllin,\r\nmy age is 29.");
- ?>
output
- my name is anllin,
- my age is 29.
读出文件内容的方法:
函数 | 功能 |
---|---|
Fgetc() | 读出一个字符,并将指针移到下一个字符 |
Fgets() | 读出一行字符,可以指定一行显示的长度。 |
Fgetss() | 从文件指针中读取一行并过滤掉HTML标记 |
Fread() | 读取定量的字符 |
Fpassthru() | 输出文件到指定处的所有剩余数据 |
File() | 将整个文件读入数组中,以行分组 |
Readfile() | 读入一个文件并写入到输出缓冲 |
File_get_contents() | 将整个文件读入一个字符串 |
Feof() | 判断读完文件函数 |
File_exists() | 查看文件是否存在 |
示例文件file1.txt的内容如下:
- my name is anllin,
- my age is 29.
fgetc — 从文件指针中读取字符
Demo.php
- <?php
- $fp = fopen('file1.txt','r');
- echo fgetc($fp);
- echo fgetc($fp);
- fclose($fp);
- ?>
Output:
- my
fgets — 从文件指针中读取一行
- <?php
- $fp = fopen('file1.txt','r');
- echo fgets($fp);
- echo fgets($fp);
- fclose($fp);
- ?>
output
- my name is anllin, my age is 29.
fgetss — 从文件指针中读取一行并过滤掉 HTML 标记
- <?php
- $fp = fopen('file3.txt','w');
- $outStr = "my name is <b>anllin</b>";
- fwrite($fp,$outStr,strlen($outStr));
- fclose($fp);
- $ftp = fopen('file3.txt','r');
- echo fgetss($ftp);
- fclose($ftp);
- ?>
Output
- my name is anllin
fread — 读取文件(可安全用于二进制文件)
- <?php
- $filename = 'file1.txt';
- $fp = fopen($filename,'r');
- $contents = fread($fp,filesize($filename));
- echo $contents;
- fclose($fp);
- ?>
Output
- my name is anllin, my age is 29.
fpassthru — 输出文件指针处的所有剩余数据
- <?php
- $filename = 'file1.txt';
- $fp = fopen($filename,'rb');
- $leftSize = fpassthru($fp);
- echo $leftSize;
- fclose($fp);
- ?>
output
- my name is anllin, my age is 29. 33
file — 把整个文件读入一个数组中
- <?php
- $lines = file('file1.txt');
- foreach ($lines as $line_num => $line)
- {
- echo $line_num.' : '.$line.'<br>';
- }
- ?>
output
- 0 : my name is anllin,
- 1 : my age is 29.
readfile — 输出一个文件
- <?php
- $size = readfile('file1.txt');
- echo $size;
- ?>
output
- my name is anllin, my age is 29.33
file_get_contents — 将整个文件读入一个字符串(php5.0新增)
- <?php
- $contents = file_get_contents('file1.txt');
- echo $contents;
- ?>
output
- my name is anllin, my age is 29.
feof — 测试文件指针是否到了文件结束的位置
- <?php
- $fp = fopen('file1.txt','r');
- while(!feof($fp))
- {
- echo fgetc($fp);
- }
- fclose($fp);
- ?>
output
- my name is anllin, my age is 29.
file_exists — 检查文件或目录是否存在
- <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
- <?php
- $filename = 'file1.txt';
- if(file_exists($filename))
- {
- echo '执行文件读写操作';
- }
- else
- {
- echo '你要找的文件不存在';
- }
- ?>
output
- 执行文件读写操作
filesize — 取得文件大小
- <?php
- $file_size = filesize('file1.txt');
- echo $file_size;
- ?>
output
- 33
unlink — 删除文件
- <?php
- $isDeleted = unlink('file3.txt');
- echo $isDeleted;
- ?>
output
- 1
rewind — 倒回文件指针的位置
ftell — 返回文件指针读/写的位置
fseek — 在文件指针中定位
- <?php
- $fp = fopen ( 'file1.txt', 'r' );
- fgetc ( $fp );
- fgetc ( $fp );
- echo ftell ( $fp ) . '<br>';
- rewind ( $fp );
- echo ftell ( $fp ) . '<br>';
- fgetc ( $fp );
- fgetc ( $fp );
- echo ftell ( $fp ) . '<br>';
- fseek($fp,0);//same as rewind ($fp)
- echo ftell ( $fp ) . '<br>';
- ?>
output
- 2020
Flock的操作值
操作值 | 意义 |
---|---|
LOCK_SH(以前为1) | 读写锁定。这意味着文件可以共享,其他人可以读该文件 |
LOCK_EX(以前为2) | 写操作锁定。这是互斥的,该文件不能被共享 |
LOCK_UN(以前为3) | 释放已有的锁定 |
LOCK_NB(以前为4) | 防止在请求加锁时发生阻塞 |
flock — 轻便的咨询文件锁定
- <?php
- $filename = 'file1.txt';
- $fp = fopen($filename,'rb');
- flock($fp,LOCK_EX);//locked
- $contents = fread($fp,filesize($filename));
- flock($fp,LOCK_UN);//unlocked
- echo $contents;
- fclose($fp);
- ?>
output
- my name is anllin, my age is 29.
目录句柄操作
opendir — 打开目录句柄
readdir — 从目录句柄中读取条目
closedir — 关闭目录句柄
- <?php
- $dir= opendir('../Basic6');
- while(!!$file = readdir($dir))
- {
- echo $file.'<br/>';
- }
- closedir($dir);
- ?>
output
- .
- ..
- .buildpath
- .project
- .settings
- demo1.php
- demo10.php
- demo11.php
- demo12.php
- demo13.php
- demo14.php
- demo15.php
- demo16.php
- demo17.php
- demo18.php
- demo19.php
- demo2.php
- demo20.php
- demo3.php
- demo4.php
- demo5.php
- demo6.php
- demo7.php
- demo8.php
- demo9.php
- file1.txt
- file2.txt
scandir — 列出指定路径中的文件和目录
- <?php
- $files = scandir('../Basic6');
- foreach($files as $file)
- {
- echo $file.'<br>';
- }
- ?>
output
- .
- ..
- .buildpath
- .project
- .settings
- demo1.php
- demo10.php
- demo11.php
- demo12.php
- demo13.php
- demo14.php
- demo15.php
- demo16.php
- demo17.php
- demo18.php
- demo19.php
- demo2.php
- demo20.php
- demo21.php
- demo3.php
- demo4.php
- demo5.php
- demo6.php
- demo7.php
- demo8.php
- demo9.php
- file1.txt
- file2.txt
rename — 重命名一个文件或目录
- <?php
- rename('demo1.php','demo01.php');
- if(file_exists('demo01.php'))
- {
- echo 'file rename success';
- }
- else
- {
- echo 'file rename fail';
- }
- ?>
output
- file rename success
rmdir — 删除目录
- <?php
- rmdir('123');
- if(file_exists('123'))
- {
- echo 'delete file fail';
- }
- {
- echo 'delete file success';
- }
- ?>
output
- delete file success