捌玖网络工作室's Archiver

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

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

  一:引论KU/XFnG)H

"L!lXPXf7JOv:`)GXJ   在任何计算机设备中,文件是都是必须的对象,而在web编程中,文件的操作一直是web程序员的头疼的地方,而,文件的操作在cms系统中这是必须的,非常有用的,我们经常遇到生成文件目录,文件(夹)编辑等操作,现在我把php中的这些函数做一详细总结并实例示范如何使用.,关于对应的函数详细介绍,请查阅php手册.此处只总结重点.和需要注意的地方.(这在php手册是没有的.)
c"pTt d+]5D6Q
d5zMF D.q(c   二:目录操作[2Y6x F$Tt"k(C
(n1Ox)lv S%[
  首先介绍的是一个从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,而后迭代列出:
4xZ$O.ZX_ }/i [code]<?php
"uP9|8I2r,S,g9A;U $base_dir    =    "filelist/";
jo Xy WI#S)MQ $fso        =    opendir($base_dir);$t,G7iO!];f
echo    $base_dir."<hr/>"        ;
FU@*l V,`qO while($flist=readdir($fso)){)pk1[/~f/d0D*?P9Uo
echo $flist."<br/>"    ;5m;Z`6x~ J
}
B9`3\QS`E closedir($fso)$mI3v5V:G+D
?>[/code]_W;r3H9s
这是讲返回文件目录下面的文件已经目录的程序(0文件将返回false).
'b IW*YJ%h e d)C Ocb!@;p
有时候需要知道目录的信息,可以使用dirname($path)和basename($path),分别返回路径的目录部分和文件名名称部分,可用disk_free_space($path)返回看空间空余空间.GVd/MH,j _4wT
1K2l(M,B ?c |!Bb
创建命令:
Htng%hA [code]mkdir($path,0777)[/code]/l pT|Nd~
,0777是权限码,在非window下可用umask()函数设置.
7[9q|/SA[tt [code]rmdir($path)[/code] `.`@-tP!q
将删除路径在$path的文件.
z aGn v&n [ FsT ] r3w#ib&O{
dir -- directory 类也是操作文件目录的重要类,有3个方法,read,rewind,close,这是一个仿面向对象的类,它先使用的是打开文件句柄,然后用指针的方式读取的.,这里看php手册:loV7a)RG:X.l
[code]<?php*Wwy8}/nW{6Ij
$d = dir("/etc/php5"); P9o\-^h1Mn.\'Q)[
echo "Handle: " . $d->handle . "\n";%h8peW [$t/b8k
echo "Path: " . $d->path . "\n";
-`2d2r{^ while (false !== ($entry = $d->read())) {
v9rA _3[~m5jRH    echo $entry."\n";fWCt;B9A{,a
}
1C9_&?.~k9w(nN/j $d->close();V0pQ@ \
?>[/code]
u t7\%Wqx&e n6E 输出:
3Q{$o#vg}S3d Gh [code]Handle: Resource id #2oKit$a B
Path: /etc/php5
[_ i3K5XU1_l .
4\{x;pS qS_? ..d3I*BGg Iz
apache
0y3t+ap)]`:G-{ cgi
z(`'N(u/M4F1{+Q6u cli[/code]
'R!I'H;R"}F;n 文件的属性也非常重要,文件属性包括创建时间,最后修改时间,所有者,文件组,类型,大小等QH[4d"r8`9i
hiR,e&F} Ri.U
下面我们重点谈文件操作.
8X}r,k!~\6t6aZ
n&z4u(b h-`y 三:文件操作%lb%r4D2Z)_,x

:_:z9s!Kt{ ]X;z ●    读文件 0Xy}&LC{'a:e

DQJ9J5C)ns e 首先是一个文件看能不能读取(权限问题),或者存在不,我们可以用is_readable函数获取信息.: kSwv/v
[code]<?php
9V8Gloxg1`HnR:{&p $file = 'dirlist.php';?9I lf2sg%TM
if (is_readable($file) == false) {
Fi8pO-s;mSHR         die('文件不存在或者无法读取');
"qz"T-y.t9Z N8m } else {0c ~8WnGT/c
        echo '存在';h5b9c9]-Exx
} [:H7Bu-d}
?>[/code]
~%~H9_1D"t"ZX.g
wEj.v7rOx;CO 判断文件存在的函数还有file_exists(下面演示),但是这个显然无is_readable全面.,当一个文件存在的话可以用
h9n | C}v%aA0^
:Ip VDQ8D"C G OQ [code]<?php+A&cn? l*qW+l
$file = "filelist.php";
A2TjW-bL5kg if (file_exists($file) == false) {X}1?y$kA9w
        die('文件不存在');
]~*y2|+_0EeA }
"H^*H-f;e(|A $data = file_get_contents($file);:W rff9b
echo htmlentities($data);kv5h{M Ro)g_
?>
t$m_^hs} [/code]G"mC"O`%yZ
但是file_get_contents函数在较低版本上不支持,可以先创建文件的一个句柄,然后用指针读取全部: P5_7b1@VxSc

]m"P&aYv [code]        $fso = fopen($cacheFile, 'r');T%{#Q(ylm0w7v:Q,kC
        $data = fread($fso, filesize($cacheFile));
&s)u"lPL&[ X         fclose($fso);[/code]t$LUT&~M e@ _g
还有一种方式,可以读取二进制的文件:
o1\_ {Wm [code]$data = implode('', file($file));[/code]
'WB\oxB ●   写文件
z?~"@ S 4@lS yl2N~/D
和读取文件的方式一样,先看看是不是能写:Y-fr v qy t4b
D K:w$H`vR$U ~
[code]<?php
]jWo)b?i ` 1V"uWWKb:N3eH`
$file = 'dirlist.php';
&u8wk,`5so if (is_writable($file) == false) {
f#O;La/Q Ro         die("我是鸡毛,我不能");myv]W3L D AZ
}/~VEx5R(xcLy
?>[/code]
_+|%O0e |cycV
k;z*n7@,VD E 能写了的话可以使用file_put_contents函数写入:
uUoY(E!Rw [code]<?php%W3~4w:hf+p_
$file = 'dirlist.php';
)p-RuV:I-MI if (is_writable($file) == false) {2LB;q6`2h-l
        die('我是鸡毛,我不能');(V9B:s] v ?,E"Er_
}
J.[ s} @v'M $data = '我是可鄙,我想要';
fj[.p3a,W@C _ file_put_contents ($file, $data);
u0C5V/O\$d ?>[/code]B`+iP2~H:o P/d8d
file_put_contents函数在php5中新引进的函数(不知道存在的话用function_exists函数先判断一下)低版本的php无法使用,可以使用如下方式:FiUF.bR-k[ xj0S:~
Jb]1L+S
[code]$f = fopen($file, 'w');
P A&x t:|S6{ fwrite($f, $data);
.A7| ` n$h SEN9F:MV fclose($f);[/code]
mo&n;Fjqz3M
8hQ'W;tk y1g 替换之.O%X.B#r$FZ `{|R
Rg{\Z
写文件的时候有时候需要锁定,然后写:5tKS:^#}9_?
[code]function cache_page($pageurl,$pagedata){
5x3shN,OPRN     if(!$fso=fopen($pageurl,'w')){%f uS R a'o
        $this->warns('无法打开缓存文件.');//trigger_errorG.x H9Hs
        return false;
|k3f9ID},Se     }"f&U xv"[2I _4C.z
    if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定/d3R8t H"S1VN O
        $this->warns('无法锁定缓存文件.');//trigger_error
6H G [te~         return false;'RRs+O1[B8c
    }(A*M4R(Lf1i^
    if(!fwrite($fso,$pagedata)){//写入字节流,serialize写入其他格式
~0a JK\5t1E         $this->warns('无法写入缓存文件.');//trigger_error
7k0T},J i0p e         return false;
&n CVN F+a0V     }x&vm'A|#v:C
    flock($fso,LOCK_UN);//释放锁定*DR.U9N(fk1Qrm @
    fclose($fso);
?9zxt3ae     return true;
/m q#sE.p2j0e b6|;x }[/code]x(JY4{^
●    复制,删除文件 $vZG/`A$V$PcAN
#d2I5G~ Q$J5_
php删除文件非常easy,用unlink函数简单操作:
Z/w)tE8vW
Ieo&tA(dY\ [code]<?php `c0ER d+B
$file = 'dirlist.php';
/}JlGDS'c;n $result = @unlink ($file);
~0H:ls"R0I if ($result == false) {E iRJmT g|6A
        echo '蚊子赶走了';;Gn'oIq
} else {
g1J;P(M%~sV%m         echo '无法赶走';
Td"E1f1NaXa8f }
Z@Z K&]wQ$Jo5G4] ?>[/code]3Vyu'Z)@r,H
即可.p;R7])F3f b
;ER3v(Rx u
复制文件也很容易:9VeH+ty[T%}*M

_i\:o"l]/a%{~r [code]<?phpXl7I GA8s'z2l
$file = 'yang.txt';%g.\'v_qW x
$newfile = 'ji.txt'; # 这个文件父文件夹必须能写4Ry#@nOT,V3{
if (file_exists($file) == false) {
a ^4v&Oi RL         die ('小样没上线,无法复制');
#c^9`9AP }
B@!K U v $result = copy($file, $newfile);6Q:G r&_ Gqk&c4f V
if ($result == false) {
[jOT]L8E|_         echo '复制记忆ok';
6OiJV!Kl ] ~t X }
h`&G;X _j3x ?>[/code]
p}AG'^9x0v t} 可以使用rename()函数重命名一个文件夹.其他操作都是这几个函数组合一下就能实现的.*W K U-~ p`H'A+VQ:w["z

a#|U'T;TH&t2V ●   获取文件属性
|0[$O/D+Y 6o]8q0ojG7~1O
我说几个常见的函数:,l'?4A(Q{$h3f
获取最近修改时间:U5i,k1i'g D
ObW)uM;["W2q9{
[code]<?php
&mA$}j@0a'qs] $file = 'test.txt';M\'_?u+K|
echo date('r', filemtime($file));
J.E9h%z0e.V ?>[/code]1hf6J*`(H K\
4m%~2{Cu/Yn*e*b
返回的说unix的时间戳,这在缓存技术常用.
6M/o!S ]:`"S%Vc
yQqmGz/B0y 相关的还有获取上次被访问的时间fileatime(),filectime()当文件的权限,所有者,所有组或其它 inode 中的元数据被更新时间,fileowner()函数返回文件所有者 ]_rz]
$owner = posix_getpwuid(fileowner($file));
4Mvep kW_2J (非window系统),ileperms()获取文件的权限,
x6Sf1sM ^ocF [code]<?php3eZb_0M
$file = 'dirlist.php';
M%@,de"i.tuoW $perms = substr(sprintf('%o', fileperms($file)), -4);:H(l-w:W1|d(Zr"L
echo $perms;
7X:h U'yR CeZ ?>[/code]
}1C2^&\XQ/`'n filesize()返回文件大小的字节数:/D0~4hg5n'z#_4^2N0j
[code]<?php'BhVP'K
V7@yC+^
// 输出类似:somefile.txt: 1024 bytes
w X1N!x1yV z+c/b S &d D$V/dy
$filename = 'somefile.txt';XhB!J Jn(s
echo $filename . ': ' . filesize($filename) . ' bytes';
:?*g'NZ6_g*j
~$ux*p{8Y ?>[/code]
0Ka*{S3@ a 获取文件的全部信息有个返回数组的函数stat()函数:J `]] `
[code]<?php\ O!tv W)GX&?
$file = 'dirlist.php';;o ]i-~9gF4p
$perms = stat($file);9T2d EIsT_
var_dump($perms);
]2I%G1DA:r ?>[/code]
x+QHI e(t 那个键对应什么可以查阅详细资料,此处不再展开.p._ qn,Vha-ms ?7E

)m7s2y4t,syg#CD+g 四:结束语5dc!N u o%v

8ne2b3_z#a 上面我简要的总结了一下几个文件操作,如果您熟练掌握以上列出的函数,已经在操作的时候没什么大的问题,php文件操作的函数变化比较快,现在已经非常强大了,文件这部分也是学习php非常重要的一部分,希望不要忽略.

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


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