PHP高级特性二之文件处理
PHP中的文件处理也是一个相当重要的模块,这一篇的主要内容就是PHP中文件系统的简介。
文件系统用途
1. 项目处理都离不开文件处理
2. 可以用文件长时间保存数据
文件系统函数用法详述
1.基本的判断函数
is_dir — 判断给定文件名是否是一个目录
is_file — 判断给定文件名是否为一个文件
is_executable — 判断给定文件名是否可执行
is_link — 判断给定文件名是否为一个符号连接
is_readable — 判断给定文件名是否可读
is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的
is_writable — 判断给定的文件名是否可写
is_writeable — is_writable 的别名
2.文件相关信息获取
file_exists — 检查文件或目录是否存在
fileatime — 取得文件的上次访问时间
filectime — 取得文件的 inode 修改时间
filegroup — 取得文件的组
fileinode — 取得文件的 inode
filemtime — 取得文件修改时间
fileowner — 取得文件的所有者
fileperms — 取得文件的权限
filesize — 取得文件大小
filetype — 取得文件类型
下面我们写一个例子,传入文件名,打印它的详细信息。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
function getFileInfo($filename){
if(!file_exists($filename)){
echo '文件'.($filename).'不存在';
return;
}
if(is_file($filename)){
echo $filename.'是一个文件';
}
if(is_dir($filename)){
echo $filename.'是一个目录';
}
if(is_executable($filename)){
echo $filename.'是可执行文件';
}else{
echo $filename.'不是可执行文件';
}
if(is_readable($filename)){
echo $filename.'是可读的';
}else{
echo $filename.'不是可读的';
}
if(is_writable($filename)){
echo $filename.'是可写入的';
}else{
echo $filename.'不是可写入的';
}
echo '文件'.$filename.'的大小是'.getFileSize(filesize($filename)).'';
echo '文件'.$filename.'的类型是'.filetype($filename).'';
echo '文件'.$filename.'的所有者是'.fileowner($filename).'';
echo '文件'.$filename.'的最后访问时间为'.getTime(fileatime($filename)).'';
echo '文件'.$filename.'的inode是'.fileinode($filename).'';
echo '文件'.$filename.'的修改时间是'.getTime(filemtime($filename)).'';
echo '文件'.$filename.'的权限是'.fileperms($filename).'';
}
function getTime($time){
return date('Y-m-d H:i:s',$time);
}
function getFileSize($size){
$dw = 'B';
if($size>=pow(2,40)){
$size=round($size/pow(2,40),2);
$dw = 'PB';
}else if($size>=pow(2,30)){
$size=round($size/pow(2,30),2);
$dw = 'TB';
}else if($size>=pow(2,20)){
$size=round($size/pow(2,20),2);
$dw = 'GB';
}else if($size>=pow(2,10)){
$size=round($size/pow(2,10),2);
$dw = 'MB';
}
return $size.$dw;
}
getFileInfo('1.php');
|
运行结果
1.php是一个文件
1.php不是可执行文件
1.php是可读的
1.php不是可写入的
文件1.php的大小是2MB
文件1.php的类型是file
文件1.php的所有者是1000
文件1.php的最后访问时间为2015-03-04 12:58:33
文件1.php的inode是536185
文件1.php的修改时间是2015-03-04 12:58:32
文件1.php的权限是33204
3.文件路径相关函数
相对路径:相对于当前目录的上级和下级目录
. 当前目录
.. 上一级目录
路径分隔符号
linux/Unix “/”
windows “\”
不管是什么操作系统PHP的目录分割符号都支技 / (Linux)
绝对路径:可以指的操作系统的根,也可以指的是存放网站的文档根目录
如果是在服务器中执行(通过PHP文件处理函数执行)路径 则 “根”指的就是操作系统的根
如果程序是下载的客户端,再访问服务器中的文件时,只有通过Apache访问,“根”也就指的是文档根目录
三个相关函数
dirname — 返回路径中的目录部分
pathinfo — 返回文件路径的信息
例如下面的例子
|
1
2
3
4
5
6
7
8
|
$url1="./aaa/bbb/index.php";
$url2="../www/yyy/login.rar";
$url3="c:/appserv/www/demo.html";
$url4="http://localhost/yyy/www.gif";
echo basename($url1);
echo basename($url2);
echo basename($url3);
echo basename($url4);
|
运行结果
index.php
login.rar
demo.html
www.gif
可以看出,basename这个函数返回的是文件的名,也就是最后一个项目。
下面我们看一下dirname的用法
|
1
2
3
4
5
6
7
8
|
$url1="./aaa/bbb/index.php";
$url2="../www/yyy/login.rar";
$url3="c:/appserv/www/demo.html";
$url4="http://localhost/yyy/www.gif";
echo dirname(dirname($url1));
echo dirname($url2);
echo dirname($url3);
echo dirname($url4);
|
运行结果
./aaa
../www/yyy
c:/appserv/www
http://localhost/yyy
可以发现,dirname这个函数可以多层嵌套使用,返回的就是它所在的路径,即除了最后一项之外所有的项。
另外 pathinfo的以上所有信息都可以获取到,另外还包括了文件名和扩展名
比如下面的结果
Array ( [dirname] => ../www/yyy [basename] => login.rar [extension] => rar [filename] => login )
4. 文件的创建删除修改
touch — 创建一个文件
unlink — 删除文件
rename — 重命名一个文件或目录
例如下面的例子
|
1
2
3
4
5
|
touch("./php.apahce"); //创建文件
unlink("C:/AppServ/www/xsphp/apache.php"); //删除文件
rename("./test.txt", "d:/test2.txt"); //重命名文件
copy("cache.txt", "./cache5.txt"); //复制文件
chmod("a.txt",755); //设置文件权限
|
权限相关内容
rwx 表这个文件的拥有者 r读 w写 x执行
rwx 表这个文件的拥有者所在的组 r读 w写 x执行
rwx 其它用户对这个为文件的权限 r读 w写 x执行
文件读写
1. file_get_contents(string)
传入文件名,直接得到文件中的文本信息,返回的内容即为文件中的文本。
例如
|
1
2
3
4
|
<?php
$str = file_get_contents("1.txt");
echo $str;
?>
|
则直接打开了 1.txt 文件中的内容,并返回文件中的文本信息。
如果文件不存在,那么会提示
Warning: file_get_contents(2.txt): failed to open stream: No such file or directory
同样,文件还可以是远程文件,例如,参数传入 http://www.qq.com
即可以呈现腾讯网的首页内容。
缺点:不能读取指定部分的内容,一次性全部读取。
2. file_put_contents(filename,content)
写入文件,filename是写入文件的文件名,content是写入内容,返回值是成功写入的字符长度。
|
1
2
3
|
<?php
echo file_put_contents("2.txt",'abcd');
?>
|
2.txt 文件如果不存在,那么则会创建这个文件并写入 abcd 这个字符串,返回 4 ,为字符串的长度。 如果文件存在,则会将文件清空,然后写入字符串,返回写入长度。
缺点:不能以追加的方式写入文件。
3.file(filename)
file是直接打开某一个文件,返回的结果是一个数组,每一行是数组的一个元素。也就是说,获取行数只需要输出数组的大小即可。例如
|
1
2
3
4
5
|
<?php
$str = file("1.txt");
var_dump($str);
echo count($str);
?>
|
即可得到数组形式的行内容,而且输出了行数。
缺点:不能读取指定部分的内容。
4.fopen(filename,mode)
filename是文件名,可以是路径加名,也可以是远程服务器文件。
mode是打开文件的方式
r,以只读模式打开文件
r+,除了读,还可以写入。
w, 以只写的方式打开,如果文件不存在,则创建这个文件,并写放内容,如果文件存在,并原来有内容,则会清除原文件中所有内容,再写入(打开已有的重要文件)
w+,除了可以写用fwrite, 还可以读fread
a,以只写的方式打开,如果文件不存在,则创建这个文件,并写放内容,如果文件存在,并原来有内容,则不清除原有文件内容,再原有文件内容的最后写入新内容,(追加)
a+,除了可以写用fwrite, 还可以读fread
b,以二进制模式打开文件(图,电影)
t,以文本模式打开文件
注意:
r+具有读写属性,从文件头开始写,保留原文件中没有被覆盖的内容;
w+具有读写属性,写的时候如果文件存在,会被清空,从头开始写。
返回的是一个文件资源
5.fwrite(file,content)
文件写入功能,file是文件资源,用fopen函数获取来的,content是写入内容。同 fputs 函数。
例如
|
1
2
3
4
5
6
7
8
9
|
<?php
$file = fopen("1.txt","r+");
$result = fwrite($file,"xx");
if($result){
echo "Success";
}else
echo "Failed";
}
?>
|
则从头开始写入资源,即把前两个字符设为 xx
6. fread(file,size)
读取文件指定部分的长度,file是文件资源,由fopen返回的对象,size是读取字符的长度。
例如
|
1
2
3
4
5
|
<?php
$file = fopen("1.txt","r");
$content = fread($file,filesize("1.txt"));
echo $content;
?>
|
不过,上述的 filesize 方法只能获取本地文件大小,对于远程文件的读取就要换一种方法了。
例如
|
1
2
3
4
5
6
7
8
|
<?php
$file = fopen("http://www.qq.com","r");
$str = "";
while(!feof($file)){ //判断时候到了文件结尾
$str.=fread($file,1024);
}
echo $str;
?>
|
7.fgets(file)
file是文件资源,每次读取一行。例如我们读取出腾讯首页一共有多少行。
|
1
2
3
4
5
6
7
8
9
10
|
<?php
$file = fopen("http://www.qq.com","r");
$str = "";
$count = 0;
while(!feof($file)){
$str .= fgets($file);
$count ++;
}
echo $count;
?>
|
会输出结果 8893,我们可以查看源文件,看看它一共有多少行,验证一下即可。
7.fgetc(file)
与fgets方法很相似,file是文件资源,每次读取个字符。例如我们读取出腾讯首页一共有多少个字符。
|
1
2
3
4
5
6
7
8
9
10
|
<?php
$file = fopen("http://www.qq.com","r");
$str = "";
$count = 0;
while(!feof($file)){
$str .= fgetc($file);
$count ++;
}
echo $count;
?>
|
上述代码便会输出所有的字符数量。
8.ftell(file)
ftell 是返回当前读文件的指针位置,file 是文件资源,是由 fopen 返回的对象。
9.fseek(file,offset,whence)
file
文件系统指针,是典型地由 fopen() 创建的 resource(资源)。
offset
偏移量。
要移动到文件尾之前的位置,需要给 offset 传递一个负值,并设置 whence 为 SEEK_END。
whence
SEEK_SET – 设定位置等于 offset 字节。
SEEK_CUR – 设定位置为当前位置加上 offset。
SEEK_END – 设定位置为文件尾加上 offset。
10.rewind($file)
回到文件头部,file是文件资源
例如
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?php
$file = fopen("1.txt","r");
echo ftell($file)."<br>"; //输出读取前的指针位置
echo fread($file,10)."<br>"; //读取10个字符,指针移动10个单位
echo ftell($file)."<br>"; //输出读取完之后当前指针位置
fseek($file,20,SEEK_CUR); //当前指针前移20单位
echo ftell($file)."<br>"; //输出移动之后指针的位置
echo fread($file,10)."<br>"; //输出读取的10个字符
echo ftell($file)."<br>"; //输出读完10个字符之后指针的位置
fseek($file,-20,SEEK_END); //指针移动到文件末尾前20个字符
echo ftell($file)."<br>"; //输出移动之后指针的位置
echo fread($file,10)."<br>"; //输出文件末尾20个字符
echo ftell($file)."<br>"; //输出读完10个字符之后指针的位置
rewind($file); //回到文件头部
echo ftell($file)."<br>"; //输出移动之后指针的位置
?>
|
运行结果:
0
cuiqingcai
10
30
uiqingcai.
40
374
i.comcuiqi
384
0
11.flock(file,operation[,wouldblock])
file
文件资源指针,是典型地由 fopen() 创建的 resource(资源)。
operation
operation 可以是以下值之一:
LOCK_SH取得共享锁定(读取的程序)。
LOCK_EX 取得独占锁定(写入的程序。
LOCK_UN 释放锁定(无论共享或独占)。
如果不希望 flock() 在锁定时堵塞,则是 LOCK_NB(Windows 上还不支持)。
wouldblock
如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),可选的第三个参数会被设置为 TRUE。(Windows 上不支持)
例如
|
1
2
3
4
5
6
7
|
<?php
$file = fopen("1.txt","a");
if(flock($file,LOCK_EX)){
fwrite($file,"xxx");
flock($file,LOCK_UN);
}
?>
|
PHP高级特性二之文件处理的更多相关文章
- logback高级特性二 异步记录日志
问题描述: 下图中JProfiler可看出logback的日志输出占了64%的cpu消耗 优化方案: 1. 这部分写日志的代码写了一些报文数据,确实是比较大的字符串.先禁掉控制台输出,生产环境也不需要 ...
- JDBC高级特性(二)事务、并发控制和行集
一.事务 事务是指一个工作单元,它包括了一组加入,删除,改动等数据操作命令,这组命令作为一个总体向系统提交运行,要么都运行成功,要么所有恢复 在JDBC中使用事务 1)con.setAutoCommi ...
- JVM高级特性-二、JVM在堆中对象的分配、布局、访问过程
前面介绍了jvm运行时数据区域后,下面讲解下对内存中数据的其他细节,看他们是如何创建.布局及访问的 一.对象的创建 1.对象的分配 对象的创建分配方式主要有两种:指针碰撞和空闲列表 指针碰撞: 假设堆 ...
- (十二)boost库之多线程高级特性
(十二)boost库之多线程高级特性 很多时候,线程不仅仅是执行一些耗时操作,可能我们还需要得到线程的返回值,一般的处理方法就是定义一个全局状态变量,不断轮训状态,就如我目前维护的一个项目,全局变量定 ...
- (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- 【Redis】二、Redis高级特性
(三) Redis高级特性 前面我们介绍了Redis的五种基本的数据类型,灵活运用这五种数据类型是使用Redis的基础,除此之外,Redis还有一些特性,掌握这些特性能对Redis有进一步的了解, ...
- 大数据笔记(二十六)——Scala语言的高级特性
===================== Scala语言的高级特性 ========================一.Scala的集合 1.可变集合mutable 不可变集合immutable / ...
- Python3学习(二)-递归函数、高级特性、切片
##import sys ##sys.setrecursionlimit(1000) ###关键字参数(**关键字参数名) ###与可变参数不同的是,关键字参数可以在调用函数时,传入带有参数名的参数, ...
- 深入浅出Redis(二)高级特性:事务
第一篇中介绍了Redis是一个强大的键-值仓储,支持五种灵活的数据结构.其实,Redis还支持其他的一些高级特性:事务.公布与订阅.管道.脚本等,本篇我们来看一下事务. 前一篇中我们提到,在Redis ...
随机推荐
- windows环境下svn同步web文件[转]
windows环境下svn同步web文件 SVN在团队开发中使用非常普遍,是一个很方便的版本控制系统. 如果要是能将SVN服务器上的数据自动发布到Web服务器,那将是整个项目开发.测试更加便捷.利用S ...
- 简述负载均衡&CDN技术
曾经见到知乎上有人问“为什么像facebook这类的网站需要上千个工程师维护?”,下面的回答多种多样,但总结起来就是:一个高性能的web系统需要从无数个角度去考虑他,大到服务器的布局,小到软件中某个文 ...
- 异步解压ZIP文件
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...
- GS线程
void GameServer::ProcessThread() { try {//在ui线程里面搞个大try不是说try效率不好吗,难道只是为了出现错误发现在GS线程里面出现的吗 ProcessTh ...
- JS数组2(冒泡排列、数组里面查找数据)
数组 一.冒泡排列 对数组attr = [1,8,6,4,5,3,7,2,9]进行由大到小排列,用冒泡排列的方法排列时,会对数组进行比较互换.如果前一个数字较大,这2个元素排列方式不变,如果后一个元素 ...
- ActionScript基本语法讲解
var a:int = 3;var b:int = 4; b = 9; trace ("a的值为:"+a);trace ("b的值为:"+b); var x1: ...
- HDU 1104 Remainder
与前一题类似,也是BFS+记录路径, 但是有很多BUG点, 第一MOD操作与%不同i,其实我做的时候注意到了我们可以这样做(N%K+K)%K就可以化为正数,但是有一点要注意 N%K%M!=N%M%K; ...
- Codeforces Round #248 (Div. 2)C 题
题目:http://codeforces.com/contest/433/problem/C 没想到做法就各种纠结, 今天做的都快疯掉了, 太弱了, 等题解一出,就各种恍然大悟 不应该不应该 正文: ...
- Sqli-labs less 36
Less-36 我们直接看到36关的源代码 上面的check_quotes()函数是利用了mysql_real_escape_string()函数进行的过滤. mysql_real_escape_st ...
- ab压力测试工具-批量压测脚本
ab(Apache benchmark)是一款常用的压力测试工具.简单易用,ab的命令行一次只能支持一次测试.如果想要批量执行不同的测试方式,并自动对指标进行分析,那么单靠手工一条一条命令运行ab,估 ...