详细学习PHP中对文件和目录的操作方法
一:引论%v x'z5|"@3M iy&Hh)k)Uk'RF3Z S'm
在任何计算机设备中,文件是都是必须的对象,而在web编程中,文件的操作一直是web程序员的头疼的地方,而,文件的操作在cms系统中这是必须的,非常有用的,我们经常遇到生成文件目录,文件(夹)编辑等操作,现在我把php中的这些函数做一详细总结并实例示范如何使用.,关于对应的函数详细介绍,请查阅php手册.此处只总结重点.和需要注意的地方.(这在php手册是没有的.)
U9S+M2D Z
二:目录操作s;p3~6v F
首先介绍的是一个从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,而后迭代列出:;W }1iQi#j&S3uD
[code]<?phpqo7L(e n#UL'u[t;j
$base_dir = "filelist/";/j+\{s:y}p]f
$fso = opendir($base_dir);Of0K!J k{Q
echo $base_dir."<hr/>" ;
while($flist=readdir($fso)){
echo $flist."<br/>" ;
}
closedir($fso)$M8c8qWy}(R \aZ
?>[/code]
这是讲返回文件目录下面的文件已经目录的程序(0文件将返回false).+{2P2X3R+K
UCHA+z$Q2LnL5rAo
有时候需要知道目录的信息,可以使用dirname($path)和basename($path),分别返回路径的目录部分和文件名名称部分,可用disk_free_space($path)返回看空间空余空间./G8X9tAuO
创建命令:
[code]mkdir($path,0777)[/code][$h pH po!a
,0777是权限码,在非window下可用umask()函数设置.} G%A&Y7SQC.]K
[code]rmdir($path)[/code]
将删除路径在$path的文件.
,Z!ulT.K-w
dir -- directory 类也是操作文件目录的重要类,有3个方法,read,rewind,close,这是一个仿面向对象的类,它先使用的是打开文件句柄,然后用指针的方式读取的.,这里看php手册:Di)@J}Tg
[code]<?php,?+\*kL;u
$d = dir("/etc/php5"); vN x,d*n8z9O/f
echo "Handle: " . $d->handle . "\n";
echo "Path: " . $d->path . "\n";
while (false !== ($entry = $d->read())) { j_ }iJL7S
echo $entry."\n";)cf)a NFV6SW
}
$d->close();
?>[/code];hu/w.X&gM a
输出:Xn!K5R^
[code]Handle: Resource id #2
Path: /etc/php5 s[ C H(`.M
.
..
apache
cgi
cli[/code]
文件的属性也非常重要,文件属性包括创建时间,最后修改时间,所有者,文件组,类型,大小等%k;Ga9p#N8? {L
下面我们重点谈文件操作.
YA#[$p:r;X,Y/D1m
三:文件操作
$?*W E_V$LQb
● 读文件
r}/X3[k7u
首先是一个文件看能不能读取(权限问题),或者存在不,我们可以用is_readable函数获取信息.:
[code]<?php4NK,ur-o H`q
$file = 'dirlist.php';;U2E1@`"tn
if (is_readable($file) == false) {
die('文件不存在或者无法读取');
} else {9}geO.?.]
echo '存在';
}Q,f*o:^ W `
?>[/code];L~xpZ$W$l4Mi-]
判断文件存在的函数还有file_exists(下面演示),但是这个显然无is_readable全面.,当一个文件存在的话可以用
7at-l|,dFk }0{,\G
[code]<?phpFmB2j QtY
$file = "filelist.php"; J7I8Q6t7q"r_W n
if (file_exists($file) == false) {;o'rTwAQSv
die('文件不存在');-ybRnv h r,Ak
}
$data = file_get_contents($file);
echo htmlentities($data);
?>
[/code];C*FRETN(z1n
但是file_get_contents函数在较低版本上不支持,可以先创建文件的一个句柄,然后用指针读取全部:
/z;zl*r%]`+Z;{l
[code] $fso = fopen($cacheFile, 'r');R |0a9o!r])c
$data = fread($fso, filesize($cacheFile));]@Ob.GNj
fclose($fso);[/code]w3nBd(C9Z6[ZC _+V
还有一种方式,可以读取二进制的文件:
[code]$data = implode('', file($file));[/code]
● 写文件 ^V%M%C2hLV |GYC
2L4u#c3a [e
和读取文件的方式一样,先看看是不是能写:(PL l1j O;B
[code]<?php&y!O {;x b-_H
2|"rn+Mp2O
$file = 'dirlist.php';
if (is_writable($file) == false) {)V;n"U$@v9Z
die("我是鸡毛,我不能");.s7c}mmO0Vj5u/s(I*AB,Y
}R\~ ~y oM1QF
?>[/code]Fg!v@z2|F
能写了的话可以使用file_put_contents函数写入:O^s3gGDU1`Y
[code]<?php
$file = 'dirlist.php';'iJC1? b
if (is_writable($file) == false) {
die('我是鸡毛,我不能');c~V%m"{QZ
}
$data = '我是可鄙,我想要';bS{M;Q5MzGn
file_put_contents ($file, $data);
?>[/code]
file_put_contents函数在php5中新引进的函数(不知道存在的话用function_exists函数先判断一下)低版本的php无法使用,可以使用如下方式:)d"TicK*OA
[code]$f = fopen($file, 'w');.b3C3AAU x`
fwrite($f, $data);
fclose($f);[/code]p:]Hd'fcNT
m#B)R-aq9vQ(x
替换之.
J+\mY*\0V(]3J
写文件的时候有时候需要锁定,然后写:
[code]function cache_page($pageurl,$pagedata){
if(!$fso=fopen($pageurl,'w')){d&fx3d a0R?
$this->warns('无法打开缓存文件.');//trigger_error;TC~A#SL0d
return false;2E C4h6ul5D
}
if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定
$this->warns('无法锁定缓存文件.');//trigger_error
return false;
}`L6d\e(N k t
if(!fwrite($fso,$pagedata)){//写入字节流,serialize写入其他格式%rsX,]Kcb:w"_ X
$this->warns('无法写入缓存文件.');//trigger_error8X"c-WC0p%[:Q@gs
return false;
}
flock($fso,LOCK_UN);//释放锁定
fclose($fso);
return true;;Q0|%u.Pj(Z
}[/code]
● 复制,删除文件 P6z g#i&X^a#V@:h
php删除文件非常easy,用unlink函数简单操作:m0c}[3y(R {R*N5k
^~0rf ~!rVez;z"zM0K
[code]<?php
$file = 'dirlist.php';
$result = @unlink ($file);
if ($result == false) {3iN+u!Tr z;Z[.l'B
echo '蚊子赶走了';
} else {,?U~7M+qj.R&I
echo '无法赶走';
}QZ)l6[4E7jn:V
?>[/code]
即可.
J'My"C8H&^-B
复制文件也很容易:B0V5p e7M)ov2Z&Y0Q
[code]<?php,P#F(X]`n;pe'^#g
$file = 'yang.txt';
$newfile = 'ji.txt'; # 这个文件父文件夹必须能写
if (file_exists($file) == false) {?E%?DW M
die ('小样没上线,无法复制');J'R(B#jiP/w
}
$result = copy($file, $newfile);4i Q.fvY.T
if ($result == false) {
echo '复制记忆ok';
}
?>[/code]Pr I*`9f7AN+J
可以使用rename()函数重命名一个文件夹.其他操作都是这几个函数组合一下就能实现的.P[)~ VAxv G
● 获取文件属性
我说几个常见的函数:zH'IhY!Gh L,Z5i
获取最近修改时间:V'TYS7V,W ?
G z},A?~Wm+G@!w
[code]<?php
$file = 'test.txt';
echo date('r', filemtime($file));v.^nQ E u
?>[/code]
euT.Y5Ic/|1rr
返回的说unix的时间戳,这在缓存技术常用.1J P*?b~ hL
相关的还有获取上次被访问的时间fileatime(),filectime()当文件的权限,所有者,所有组或其它 inode 中的元数据被更新时间,fileowner()函数返回文件所有者 1X1V+[0MhB
$owner = posix_getpwuid(fileowner($file));-}I B&Z]bkW
(非window系统),ileperms()获取文件的权限,
[code]<?php
$file = 'dirlist.php';(L:k ]0u,{^X*Eo
$perms = substr(sprintf('%o', fileperms($file)), -4);v:[9H6[)A#Z B wC
echo $perms;/km;G]X3gx
?>[/code]
filesize()返回文件大小的字节数:%f#R4l7XM&i{hv
[code]<?php5v(uL`&Y(^6^ ]
// 输出类似:somefile.txt: 1024 bytes
$filename = 'somefile.txt';g+d#OnV1{$\+w|&s[Zr
echo $filename . ': ' . filesize($filename) . ' bytes';'uuj h1`
?>[/code]@zs9c.q
获取文件的全部信息有个返回数组的函数stat()函数:l!z|%w\b
[code]<?php
$file = 'dirlist.php';
$perms = stat($file);
var_dump($perms);
?>[/code]
那个键对应什么可以查阅详细资料,此处不再展开.-}o;B@CO