捌玖网络工作室's Archiver

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

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

  一:引论%v x'z5|"@3M i y&Hh)k)U
k'RF3Z S'm
  在任何计算机设备中,文件是都是必须的对象,而在web编程中,文件的操作一直是web程序员的头疼的地方,而,文件的操作在cms系统中这是必须的,非常有用的,我们经常遇到生成文件目录,文件(夹)编辑等操作,现在我把php中的这些函数做一详细总结并实例示范如何使用.,关于对应的函数详细介绍,请查阅php手册.此处只总结重点.和需要注意的地方.(这在php手册是没有的.)
F|y6M*c| U9S+M2D Z
  二:目录操作s;p3~6v F

(BXr `E   首先介绍的是一个从目录读取的函数,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/>"        ;
/l+~Z.d'B%`%Ld9k while($flist=readdir($fso)){
.P)DdWo echo $flist."<br/>"    ;
8AY6U3TP8w5sLT }
2ET7|)WN closedir($fso)$M8c8qW y}(R \aZ
?>[/code]
qj x/jc ydD 这是讲返回文件目录下面的文件已经目录的程序(0文件将返回false).+{2P2X3R+K
UCHA+z$Q2LnL5rAo
有时候需要知道目录的信息,可以使用dirname($path)和basename($path),分别返回路径的目录部分和文件名名称部分,可用disk_free_space($path)返回看空间空余空间./G8X9tAuO

V!S0f],L)u'H'K 创建命令:
}(f]\,s\U|R W [code]mkdir($path,0777)[/code][$h pHpo!a
,0777是权限码,在非window下可用umask()函数设置.} G%A&Y7SQC.]K
[code]rmdir($path)[/code]
7{'XN!TiA 将删除路径在$path的文件.
u*G8{!^bPocqZ ,Z!ulT.K-w
dir -- directory 类也是操作文件目录的重要类,有3个方法,read,rewind,close,这是一个仿面向对象的类,它先使用的是打开文件句柄,然后用指针的方式读取的.,这里看php手册:Di)@J}Tg
[code]<?php,?+\*k L;u
$d = dir("/etc/php5"); vNx,d*n8z9O/f
echo "Handle: " . $d->handle . "\n";
F-GTEO echo "Path: " . $d->path . "\n";
GR?$T__$bR8B while (false !== ($entry = $d->read())) { j_ }i JL7S
   echo $entry."\n";)cf)a NFV6SW
}
V$P+e5t Emd1U(qLV $d->close();
I/E,GIU+D4]m ?>[/code];hu/w.X&gM a
输出:Xn!K5R^
[code]Handle: Resource id #2
,Lf$XSuS^ Path: /etc/php5 s[ C H(`.M
.
x*p/x R$Q1J ..
8I vEuu9R apache
)V8U2h oA$H cgi
Ba-^8@9DS cli[/code]
B.i+^3wq+Z+nh!}Ji2t 文件的属性也非常重要,文件属性包括创建时间,最后修改时间,所有者,文件组,类型,大小等%k;Ga9p#N8? {L

&E0Z G!ru 下面我们重点谈文件操作.
/j,o_(A!^ `V LmIH` YA#[$p:r;X,Y/D1m
三:文件操作
tT:u%m d)Y $?*W E_V$LQb
●    读文件
(fy8L$i/p6k8XGx(] r}/X3[k7u
首先是一个文件看能不能读取(权限问题),或者存在不,我们可以用is_readable函数获取信息.:
k5x6w e zS jg [code]<?php4NK,ur-o H`q
$file = 'dirlist.php';;U2E1@`"tn
if (is_readable($file) == false) {
$D0Gil0}Y         die('文件不存在或者无法读取');
3||'N k3u5aHz*J } else {9}geO.?.]
        echo '存在';
3n Gqf5D;r@ }Q,f*o:^ W`
?>[/code];L ~xpZ$W$l4Mi-]

/v y"a"U{ 判断文件存在的函数还有file_exists(下面演示),但是这个显然无is_readable全面.,当一个文件存在的话可以用
Kj K)?:~qw'w 7at-l|,dFk }0{,\ G
[code]<?phpFm B2j QtY
$file = "filelist.php"; J7I8Q6t7q"r_ W n
if (file_exists($file) == false) {;o'rT w AQSv
        die('文件不存在');-ybRnvh r,Ak
}
S^,^_/u-e $data = file_get_contents($file);
.~ m3[8V0m m6d echo htmlentities($data);
G,@@'J.}/AG Z4L ?>
t&JV\7TRX.Zudz^v [/code];C*FRETN(z1n
但是file_get_contents函数在较低版本上不支持,可以先创建文件的一个句柄,然后用指针读取全部:
N7X/K!K-O&@ r /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
还有一种方式,可以读取二进制的文件:
zZ kF[9t!xN%E [code]$data = implode('', file($file));[/code]
1f/uq5NQ(d#Iua/@ ●   写文件 ^V%M%C2hLV |GYC
2L4u#c3a[e
和读取文件的方式一样,先看看是不是能写:(PL l1j O;B

,Yz5U_HM},h$WF [code]<?php&y!O {;x b-_H
2|"rn+Mp2O
$file = 'dirlist.php';
&C]Z0cd if (is_writable($file) == false) {)V;n"U$@v9Z
        die("我是鸡毛,我不能");.s7c}mmO0Vj5u/s(I*AB,Y
}R\~ ~yoM1QF
?>[/code]Fg!v@z2|F

BmI h9jh 能写了的话可以使用file_put_contents函数写入:O^s3gGDU1`Y
[code]<?php
j!~Y2RGv6W2P2Y $file = 'dirlist.php';'iJC1? b
if (is_writable($file) == false) {
6UG v4w/q3ok         die('我是鸡毛,我不能');c~V%m"{QZ
}
9Rs,eI6m6^A9Aq'O2? $data = '我是可鄙,我想要';bS{M;Q5MzG n
file_put_contents ($file, $data);
S&dA:C(m(eO4n)n ?>[/code]
V6GAN0St[o file_put_contents函数在php5中新引进的函数(不知道存在的话用function_exists函数先判断一下)低版本的php无法使用,可以使用如下方式:)d"TicK*OA

IzV)I5f [code]$f = fopen($file, 'w');.b3C3AAUx`
fwrite($f, $data);
/I1O!YA a;V ]-U fclose($f);[/code] p:]Hd'fcNT
m#B)R-aq9vQ(x
替换之.
es2po1]P!W J+\mY*\0V(]3J
写文件的时候有时候需要锁定,然后写:
m ]#z6y bx [code]function cache_page($pageurl,$pagedata){
2fKg0Ocy,Q#z_JT     if(!$fso=fopen($pageurl,'w')){d&fx3d a0R?
        $this->warns('无法打开缓存文件.');//trigger_error;TC~A#SL0d
        return false;2EC4h6u l5D
    }
;rD)O*X_5L)Y:m1q     if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定
[0mSO*d {sG$a%Kz         $this->warns('无法锁定缓存文件.');//trigger_error
cgeos!rF         return false;
xU(vPx4_#`7V8`     }`L6d\e(N kt
    if(!fwrite($fso,$pagedata)){//写入字节流,serialize写入其他格式%rsX,]Kcb:w"_ X
        $this->warns('无法写入缓存文件.');//trigger_error8X"c-WC0p%[:Q@gs
        return false;
.`6O4V$e C T8^ G     }
6P BY+w"rr-\#P:E     flock($fso,LOCK_UN);//释放锁定
&MrD;r4{qT f$M     fclose($fso);
m$Z7T MRqB~f     return true;;Q0|%u.Pj(Z
}[/code]
([WfonrY!n ●    复制,删除文件 P6zg#i&X^a#V@:h

C-Mq%w7D2Ed0V1s php删除文件非常easy,用unlink函数简单操作:m0c}[3y(R {R*N5k
^~0rf~!rVez;z"zM0K
[code]<?php
+C5aj Ob0S#PE0_ X $file = 'dirlist.php';
"Qt7h7?0oK8W $result = @unlink ($file);
(Z9DqN.A8D3dk if ($result == false) {3iN+u!Tr z;Z[.l'B
        echo '蚊子赶走了';
;m w w9E hb | } else {,?U~7M+qj.R&I
        echo '无法赶走';
Lc.MiH;`.h }QZ)l6[4E7jn:V
?>[/code]
Pd{8X'WM$N 即可.
%i#el$ZF+q!t+F J'My"C8H&^-B
复制文件也很容易:B0V5p e7M)o v2Z&Y0Q

!j]7m5[L&~%W [code]<?php,P#F(X]`n;pe'^#g
$file = 'yang.txt';
HGr9r:X+|*wWx k $newfile = 'ji.txt'; # 这个文件父文件夹必须能写
1R8xC3u6?m8l if (file_exists($file) == false) {?E%?DWM
        die ('小样没上线,无法复制');J'R(B#j iP/w
}
,T(Ih(C'p4P $result = copy($file, $newfile);4i Q.fvY.T
if ($result == false) {
H.Rpl4x$s!y         echo '复制记忆ok';
!ZBp!Rv [$@4e8Y }
:F~1I e8M.MFB ?>[/code]PrI*`9f7AN+J
可以使用rename()函数重命名一个文件夹.其他操作都是这几个函数组合一下就能实现的.P[)~ VAxvG

!NI;C l*E&` |] ●   获取文件属性
8T h y#t&w:x
]aA)wb;x:i 我说几个常见的函数:zH'IhY!GhL,Z5i
获取最近修改时间: V'TYS7V,W ?
G z},A?~Wm+G@!w
[code]<?php
d9f3kD?8D#qs $file = 'test.txt';
r!a1kokb e!M#a9K echo date('r', filemtime($file));v.^nQE u
?>[/code]
&O%u!L0x-MA7j.PH euT.Y5I c/|1r r
返回的说unix的时间戳,这在缓存技术常用.1J P*?b~hL

e,P~$CP+url 相关的还有获取上次被访问的时间fileatime(),filectime()当文件的权限,所有者,所有组或其它 inode 中的元数据被更新时间,fileowner()函数返回文件所有者 1X1V+[0M hB
$owner = posix_getpwuid(fileowner($file));-}IB&Z]bk W
(非window系统),ileperms()获取文件的权限,
%[p&O?h4? [code]<?php
;] hh;xF8y$U $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]
q9B%r1OU8[F4A$| Q filesize()返回文件大小的字节数:%f#R4l7XM&i{hv
[code]<?php5v(uL`&Y(^6^ ]

IO\1n#c // 输出类似:somefile.txt: 1024 bytes
8e*]$q1]m1?(Mve
7b#VHW? PB D7r $filename = 'somefile.txt';g+d#OnV1{$\+w|&s[Zr
echo $filename . ': ' . filesize($filename) . ' bytes';'uuj h1`

3K&s@,A~"K'P7tM g ?>[/code]@z s9c.q
获取文件的全部信息有个返回数组的函数stat()函数: l!z|%w\b
[code]<?php
?i6d?'u I&p9U $file = 'dirlist.php';
)|7EN7KU7pV $perms = stat($file);
-n Y,Y0xiK6g var_dump($perms);
N/{&^h-m$f+yV-o ?>[/code]
5| v X'`:b'f 那个键对应什么可以查阅详细资料,此处不再展开.-}o;B@ CO

~4lVTc/s 四:结束语
fSqlg u7Dm;Q] 7F.H!DxnR P8Eb
上面我简要的总结了一下几个文件操作,如果您熟练掌握以上列出的函数,已经在操作的时候没什么大的问题,php文件操作的函数变化比较快,现在已经非常强大了,文件这部分也是学习php非常重要的一部分,希望不要忽略.

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.