捌玖网络工作室's Archiver

admin 发表于 2007-11-17 09:00

详细学习PHP中对文件和目录的操作方法

  一:引论
gIbzSr.Y :q'z1Y{.E V
  在任何计算机设备中,文件是都是必须的对象,而在web编程中,文件的操作一直是web程序员的头疼的地方,而,文件的操作在cms系统中这是必须的,非常有用的,我们经常遇到生成文件目录,文件(夹)编辑等操作,现在我把php中的这些函数做一详细总结并实例示范如何使用.,关于对应的函数详细介绍,请查阅php手册.此处只总结重点.和需要注意的地方.(这在php手册是没有的.)r;X e2dJ*dr

qQ|M]G'\-^4q?I   二:目录操作
9aB4o `-Xqa 7^k{"U vu
  首先介绍的是一个从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,而后迭代列出:4bmyQ1}XU"C-r!~+E
[code]<?php
8xTb8Qr/e,e $base_dir    =    "filelist/";'rQ4s5Kn(_'uJ
$fso        =    opendir($base_dir);
2|QL0BlXi ] echo    $base_dir."<hr/>"        ;
`0IqCsB'c X~ while($flist=readdir($fso)){,y*a5j:^sV:~y]e
echo $flist."<br/>"    ;w.MRM+EfT9E
}
:p'sJW\ closedir($fso)
v.N?I]rM8u ?>[/code]TI({%~0\,gC e
这是讲返回文件目录下面的文件已经目录的程序(0文件将返回false)./p D V+UH!j7y

|(pU;_.@ 有时候需要知道目录的信息,可以使用dirname($path)和basename($path),分别返回路径的目录部分和文件名名称部分,可用disk_free_space($path)返回看空间空余空间.
5K/w,Fg1~z
kDD v~[Z#Oh9f 创建命令:N,Q'c^+[9Shu
[code]mkdir($path,0777)[/code]
.\cg DTq;EVb ,0777是权限码,在非window下可用umask()函数设置. s.Ti$uD9U
[code]rmdir($path)[/code]o K^_[J
将删除路径在$path的文件.
+~'W%xP7_P)h
7dD!e4}\R.a&Q'[;hJ dir -- directory 类也是操作文件目录的重要类,有3个方法,read,rewind,close,这是一个仿面向对象的类,它先使用的是打开文件句柄,然后用指针的方式读取的.,这里看php手册:
-P2}4n_!uUz [code]<?php E"}!b&z,@(@
$d = dir("/etc/php5");
M$hLrt5NF echo "Handle: " . $d->handle . "\n";
6B`&I[3sUN echo "Path: " . $d->path . "\n";o-PT+w1C6?xi#J?
while (false !== ($entry = $d->read())) {
MlCB3k~    echo $entry."\n";hx"AdZ(wA
}-\0}mS Ed(G A]1]%y
$d->close();.z`laekzd
?>[/code]
+MZ ~'M4M(k[v 输出:}#\u6k zso"GH{
[code]Handle: Resource id #2
#u [y%W*c_ JI Path: /etc/php5
n O$o0M/R .Wef kV R+MXT#S
..'N"F0eL"k
apache
5p0t f&c1E2G Y!vf cgi
9vtPY U)hN.W[ cli[/code]T6h!Bq\%[ ?+[
文件的属性也非常重要,文件属性包括创建时间,最后修改时间,所有者,文件组,类型,大小等;H/lQE)e ?$i J

Bx)QYk!e8HZ(O 下面我们重点谈文件操作.:K;BxxZ[ P+{
d6Q Gtp#Mj
三:文件操作
C/q(]k~5A*E#O e )J4?f/Y,M
●    读文件 9Oqj6yc

KvC8~bMY 首先是一个文件看能不能读取(权限问题),或者存在不,我们可以用is_readable函数获取信息.:
7u,B}\ZW [code]<?php3|8w.IK2j4d7U J
$file = 'dirlist.php';
/MR6f0eX'sd if (is_readable($file) == false) {
u lC)C8A7q v         die('文件不存在或者无法读取');
4I6@I0mX+v"s } else {
-Y gC/g.Qr$D         echo '存在';I+tZqrWqr
}l\,]x[NM6@mt$I$s
?>[/code]0i*{,UHu8Hid8L
+]@ MPhE|9e
判断文件存在的函数还有file_exists(下面演示),但是这个显然无is_readable全面.,当一个文件存在的话可以用
5I)W']%L*l gz hpznf
[code]<?php
oT Yg` $file = "filelist.php";,E)}~5O2e p
if (file_exists($file) == false) {
y7S@#I#B y[km$X         die('文件不存在');#ri"gXvf1ag }
}U)[r!xWO-b:_
$data = file_get_contents($file);};p&I@'zR%?
echo htmlentities($data);2`8xYdYnV S
?>6ig#Q-z%v j
[/code]
sT-zR {8s4R:o&h 但是file_get_contents函数在较低版本上不支持,可以先创建文件的一个句柄,然后用指针读取全部:
Q&[ _4fU!c {3n\KARo
[code]        $fso = fopen($cacheFile, 'r');s2E-d!Rj
        $data = fread($fso, filesize($cacheFile));\r&Co7\&SJi
        fclose($fso);[/code] fA[O0L3P I
还有一种方式,可以读取二进制的文件:
F$],y(u+xC |KZ Dr [code]$data = implode('', file($file));[/code]
,eV5~gu9K"IJW4y ●   写文件
fW} zJ!| }6{/y'V6R
](Z9e-hCpe 和读取文件的方式一样,先看看是不是能写:
WA~eo3r4L
%[5]O9SjeZ,`)A [code]<?php
-j ]tT nz7x1H j2SZ W@"Bv[
$file = 'dirlist.php';qxc `bC
if (is_writable($file) == false) {
(S:p-XoQ"jZ G         die("我是鸡毛,我不能");
bo$C/Ro7~0f&f }
B3m _c%j4ftF ?>[/code]/b.t,_rlT4N}
%GpG$V2@ S
能写了的话可以使用file_put_contents函数写入:!Tbrr f'U(s&C:G;R i
[code]<?php
+u;o%t[ L+FlLR:s $file = 'dirlist.php';9H_X}5p8hy
if (is_writable($file) == false) {
8I&L-w"D @%Mp3|         die('我是鸡毛,我不能');%sO7SK)Q
}.Y4pnh%]#Kl9C8R
$data = '我是可鄙,我想要';
!] HG \"d7sE5G#G file_put_contents ($file, $data);
'_(M"]+dx%U6B ?>[/code] ZS'SD s:@u\
file_put_contents函数在php5中新引进的函数(不知道存在的话用function_exists函数先判断一下)低版本的php无法使用,可以使用如下方式:
4D8tJd d0t8M`W
!v w:[1^(ul~ [code]$f = fopen($file, 'w');
ivC kR2uu2X fwrite($f, $data); }#W'j/b Kj3Y
fclose($f);[/code].D i Q0[;e;_+TC7l

"Ymv3y(bn~ 替换之.
U!RLAghD nO,cyw/u} c c
写文件的时候有时候需要锁定,然后写:
T"O`N4v/o)T [code]function cache_page($pageurl,$pagedata){
7OU'Ei6?     if(!$fso=fopen($pageurl,'w')){
!@ ^}/q r5EqY+c"bW5O         $this->warns('无法打开缓存文件.');//trigger_error _7Db4| e s"}
        return false;
\C `)d5Bqo     }
"McWJ-eJ     if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定Y w;Rtl
        $this->warns('无法锁定缓存文件.');//trigger_error
I#_ JB(R         return false;Xf!hoQ;kk m6`.Y1k
    }*f:I`$a'Kp
    if(!fwrite($fso,$pagedata)){//写入字节流,serialize写入其他格式
:Dh YE3g*K         $this->warns('无法写入缓存文件.');//trigger_error#A(U)J/J2je`*gt
        return false;M:|djd lLF
    }U aWG.a U
    flock($fso,LOCK_UN);//释放锁定r8Nl:OVB
    fclose($fso);
([v&y#Ty     return true;:b"? Wx8[iU R
}[/code]
3T"d:ICW^ { ●    复制,删除文件 @!E%mToJ!g^ o
*Ba3@ Q |
php删除文件非常easy,用unlink函数简单操作:
~9S)W)D[v p;GE:z1wS2C(M6Q&V
[code]<?php
H]F5tJP_ $file = 'dirlist.php';J`-? r] I O2F"n
$result = @unlink ($file);
,ar0[*{-J?gY3]z W if ($result == false) {
kl+M&JcBh{3u         echo '蚊子赶走了';
3d_ i x!olL2D/RAK9v } else {1yYb!^~&w X4?)n
        echo '无法赶走';
{Etqb|7b }
bS#Jf'y&i'A ?>[/code] gJ w1F?P
即可.Jz'v&Amq
6jv]d+M7Dr
复制文件也很容易:I~$U&aS+G0{L
+}-?N(kbX3S9e
[code]<?php
2EKj2zu4}Y W $file = 'yang.txt'; b/O6B/]1J
$newfile = 'ji.txt'; # 这个文件父文件夹必须能写
Z:E7bX:y'Y9`/T:P if (file_exists($file) == false) {(E;sV:Ya0y.N
        die ('小样没上线,无法复制');
H }hpm$S5|S }3C/y,{-jDGaD
$result = copy($file, $newfile);JC4v3sik'o
if ($result == false) {5} T J$mT7j
        echo '复制记忆ok';.nnm7b [D/W7f
}
'@|/^"a;PkJ ?>[/code]
tj/B'W^ 可以使用rename()函数重命名一个文件夹.其他操作都是这几个函数组合一下就能实现的.1Qm"w(J+H

8pL8[Ij*VF|a ●   获取文件属性
PFm'w&KX9I#H
K\\ egB8I5Q"Zw 我说几个常见的函数:yy T)y+v4a
获取最近修改时间:o]CA8t"hz:E*q;j

q$|?@U"v1e e [code]<?php
1R"A0|+QA$~CQ $file = 'test.txt';
z:kLI#P%? echo date('r', filemtime($file));4s#h%a]9Mf
?>[/code]:bbaW\(? }jH
d:|)xC:q4c_
返回的说unix的时间戳,这在缓存技术常用.e+?&JA1b)R6d

u ~4b)w:Yy+e-r@9Y*i 相关的还有获取上次被访问的时间fileatime(),filectime()当文件的权限,所有者,所有组或其它 inode 中的元数据被更新时间,fileowner()函数返回文件所有者
s A$`K.?o^ $owner = posix_getpwuid(fileowner($file)); [@d`2`me(j'I
(非window系统),ileperms()获取文件的权限,B0Gn lpn z6kt+Q
[code]<?php
U"@8`Grp $file = 'dirlist.php';
-YT*h@F3W,~t^Q(D%s $perms = substr(sprintf('%o', fileperms($file)), -4);)DAy`*r;E
echo $perms;
|AgT7uPw ?>[/code]
T&tzBCB9Nd filesize()返回文件大小的字节数:
F4yN'X-~? [code]<?php%dj0\#p3m pX1L3j

&O(]8A]"Q {T // 输出类似:somefile.txt: 1024 bytesh&E@5e8rdMe9q!X
`,R:U&nks$M@
$filename = 'somefile.txt';
'yJ:[;ZFyq echo $filename . ': ' . filesize($filename) . ' bytes';
1CY3S8}u6G4_$@i /}4}A~7Q!b8L
?>[/code]sMHt%z-w-_
获取文件的全部信息有个返回数组的函数stat()函数:
,}isNh WYAq [code]<?php
Ur3w `?&{ $file = 'dirlist.php';$w2c QM BZ
$perms = stat($file);
d _)e#_9wf L var_dump($perms);
8jwr?b-t$Qp$~7d ?>[/code]
6\c0u#s$I"{ 那个键对应什么可以查阅详细资料,此处不再展开.
qV,pwl8pQl ^]*}T/_ t \ Yl
四:结束语
-Z ME+t1D"V$J\ :zw;\3m9B
上面我简要的总结了一下几个文件操作,如果您熟练掌握以上列出的函数,已经在操作的时候没什么大的问题,php文件操作的函数变化比较快,现在已经非常强大了,文件这部分也是学习php非常重要的一部分,希望不要忽略.

页: [1]
【捌玖网络】已经运行:


Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.