捌玖网络工作室's Archiver

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

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

  一:引论
IE5{lIU)] "mI?/~+^1XO(?8I
  在任何计算机设备中,文件是都是必须的对象,而在web编程中,文件的操作一直是web程序员的头疼的地方,而,文件的操作在cms系统中这是必须的,非常有用的,我们经常遇到生成文件目录,文件(夹)编辑等操作,现在我把php中的这些函数做一详细总结并实例示范如何使用.,关于对应的函数详细介绍,请查阅php手册.此处只总结重点.和需要注意的地方.(这在php手册是没有的.)^C&C!RR c$z

6l@R,K+g.B6n   二:目录操作 oE}:c }P
-[V!i5_6GTH
  首先介绍的是一个从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,而后迭代列出:&FE4{ A)@tK1gz4z
[code]<?php
s9MZ/pHbv Q $base_dir    =    "filelist/";
g.}cT.^ $fso        =    opendir($base_dir); X U.J;y'k$?p2Y2e_,i
echo    $base_dir."<hr/>"        ;KCL"L)t(y
while($flist=readdir($fso)){q*iUB u)T%PPGb
echo $flist."<br/>"    ;
@[D1~+W~ }
4FOQIN&T closedir($fso)-}_|Oy[yy
?>[/code]
9F I+w*l+k2n u 这是讲返回文件目录下面的文件已经目录的程序(0文件将返回false).3R.e G)XE,c'r~

*SGxbDW*C jm 有时候需要知道目录的信息,可以使用dirname($path)和basename($path),分别返回路径的目录部分和文件名名称部分,可用disk_free_space($path)返回看空间空余空间.pH9e}"Si4]2_

8N5XT/~H 创建命令:3lD%q7K;@^p(E
[code]mkdir($path,0777)[/code]k2r0f ~!Y(}KT
,0777是权限码,在非window下可用umask()函数设置.
M b2~znGg [code]rmdir($path)[/code]
_dP"q.`BW 将删除路径在$path的文件.
(h4iioV w ,NfS(\,Y
dir -- directory 类也是操作文件目录的重要类,有3个方法,read,rewind,close,这是一个仿面向对象的类,它先使用的是打开文件句柄,然后用指针的方式读取的.,这里看php手册:
/g6t |#xK []F [code]<?php0V:j6}U0T.VT
$d = dir("/etc/php5");
j-o3["BCR+B([ echo "Handle: " . $d->handle . "\n"; @q^l#uPw7c8E
echo "Path: " . $d->path . "\n";
)N`*r(x1o!~Jk,d while (false !== ($entry = $d->read())) {
1L@jK/}/j4Y'D[S    echo $entry."\n";$o0`1@ Evk1nT*Qae
}8iRv LP
$d->close();"PaKI!V5n0\%J&B7SP@
?>[/code]
(_]7z%R%W I`f 输出:xj+J]u.\
[code]Handle: Resource id #2{;Q0H*{I
Path: /etc/php5
x2GG'}| I,| .9{9J Xj(j Z:cv ])nV
..;K8RJ-Ed$Y
apache
eDG)OGmN cgi
h0tf)fF cli[/code]I)x#o:X2iQ DKz {4q
文件的属性也非常重要,文件属性包括创建时间,最后修改时间,所有者,文件组,类型,大小等
@%` iAS a+c]"o
B})]3r4FR"` 下面我们重点谈文件操作.3e:] `1Lv4z)}
F/@7W ~0T+{,b\y Y
三:文件操作;tI ]&| K+Z

I,l'k(f-VS _ ●    读文件 ;HL xwz uy^

8DSy2y3n9m!kIF 首先是一个文件看能不能读取(权限问题),或者存在不,我们可以用is_readable函数获取信息.: 8~t)Kh2I5SG*E |
[code]<?php
;o7| l_/T1p/k(c pu-h $file = 'dirlist.php';8Lxs"l(xv
if (is_readable($file) == false) {\?k9nS9R&x*H$Ij PP
        die('文件不存在或者无法读取');
zx,`fC2G } else {4e9Jr&|vf#f
        echo '存在';
QcB*P%|W }
:di)B8R^ ? Cb WaA ?>[/code]igf(X$M Th4V
uOBk"LJl
判断文件存在的函数还有file_exists(下面演示),但是这个显然无is_readable全面.,当一个文件存在的话可以用%{xZP'C0x)v2H A2XAP
xu/W%W qK4Dp:B!~e
[code]<?php
dS;O{pL-s-pJ $file = "filelist.php"; g6m6lUf8S
if (file_exists($file) == false) {)Q4Cw/VcA!?5y
        die('文件不存在');
K F3v]c!C+W} }q2c? ?T z3d?
$data = file_get_contents($file);
d!}_W0m C echo htmlentities($data); GQ8V$Bqi%T` E
?>
]o2f k-x|xP [/code]
"I1|bb^;k.p-i5a#R\JB 但是file_get_contents函数在较低版本上不支持,可以先创建文件的一个句柄,然后用指针读取全部:#R+oR%M6U@&P b&a

j$Cw)uD? [code]        $fso = fopen($cacheFile, 'r');
&r wy+VB{-N8\ WyF-}         $data = fread($fso, filesize($cacheFile));,AJi6K S,T;v
        fclose($fso);[/code])E.T6?%@ bU'D
还有一种方式,可以读取二进制的文件:
6}4L%t9r-i [code]$data = implode('', file($file));[/code]
@2pC"y4a$~'X7I ●   写文件
;?c4S1`CX
#E(|2uDE0~Y(}~ 和读取文件的方式一样,先看看是不是能写:V` t.MA#b'PS9h/I;K

4Ng9?E` [code]<?phpPH$B2S+y

1DWIOLPV2|'lu;zu4d $file = 'dirlist.php';dKAu [?
if (is_writable($file) == false) {u+~\s3A4Lm
        die("我是鸡毛,我不能");ge ?SgX{^?
}_L0p;T^ r4O
?>[/code]
,}.[R&@o#i 5u;C%N A3m)o-a P
能写了的话可以使用file_put_contents函数写入:
,bbec~oy4{2N VA [code]<?php.J)[v~;Oz4HP.s
$file = 'dirlist.php';
w"R{ w%N| if (is_writable($file) == false) {(mB"ar@-\
        die('我是鸡毛,我不能');qxk_4dV
}
g3Fp1[nBF f#c $data = '我是可鄙,我想要';
i$d,Q7M? C a?7? file_put_contents ($file, $data);v0Wj-p4WO
?>[/code]
s ~*qb!f\ file_put_contents函数在php5中新引进的函数(不知道存在的话用function_exists函数先判断一下)低版本的php无法使用,可以使用如下方式:
*I+o2@L&P S^-z
m-r'dN'X&o [code]$f = fopen($file, 'w');
W7y~'K`/] fwrite($f, $data);d"\D s^/f*fr
fclose($f);[/code]
f-I4v)pe(DY
1^ h}#b Y 替换之. N EA9~2MD [
)bKJ:M'MeH|G.f
写文件的时候有时候需要锁定,然后写:
*Vv:w u0yY [code]function cache_page($pageurl,$pagedata){
4Bu:[4S@X     if(!$fso=fopen($pageurl,'w')){h'{"e^;|&csj*[e2ne
        $this->warns('无法打开缓存文件.');//trigger_error
$~'r-}H j/Hx         return false;R@SMB/IYu1V!U
    }
7V N&p Nqa     if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定
]db c]mS/fw p         $this->warns('无法锁定缓存文件.');//trigger_error
RS3e{ ROI.Nf         return false;
{g"Nu h"Xi D     }vc/~&bL@&d
    if(!fwrite($fso,$pagedata)){//写入字节流,serialize写入其他格式/hh"`6f E\k
        $this->warns('无法写入缓存文件.');//trigger_error
dVx.C)bvaaK9{\B         return false;
2H-? k_a]     }+m0]7nn%vON Hz-`
    flock($fso,LOCK_UN);//释放锁定
rM[8pI?2yo y     fclose($fso);0b(z%]7O c6V `s
    return true; L!SOhp h2s5g
}[/code]
Pw(? s?+ml uv(B7L ●    复制,删除文件 d*eo:C&O{I^ p
k6m6R6on*M
php删除文件非常easy,用unlink函数简单操作:#@_/^u4V0v
*aoZ8X7a|
[code]<?phpv0a]:zx ZI@
$file = 'dirlist.php';
fb!W{3epA cr $result = @unlink ($file);F0R1X3O`(B
if ($result == false) {
aY}5n?$@m%b         echo '蚊子赶走了';
zE$rL I+X } else {b6h#i3~j[
        echo '无法赶走';
'EEF ?:^*Ct6U&| }
fL2['c,S3fb ?>[/code]
)ql/Mm Lb}!tkX@ 即可.%]E r5Azl/F

0Dv!\!g B/ic 复制文件也很容易:` SSc!v(V F
*Cx ] O5R^C ^"b5e
[code]<?php
UtJu)M m^l $file = 'yang.txt';.?_Kkt|6] E
$newfile = 'ji.txt'; # 这个文件父文件夹必须能写
T{ GD'b%rL if (file_exists($file) == false) {+|^t$|f.EM
        die ('小样没上线,无法复制');
*r e9H,\0I:k4xt/S P }
k"F|%a;\P| $result = copy($file, $newfile);
8Tb,h3J AP if ($result == false) {XG P1V}w#`1i
        echo '复制记忆ok';9G I O:Vt!@#X;C4f
}
G?k7f-vnOSu ?>[/code]
\tChu.o 可以使用rename()函数重命名一个文件夹.其他操作都是这几个函数组合一下就能实现的.
'wZ)}&mC E.[ IlT:_D:h7]6[V
●   获取文件属性
E9p"Z^e ? j ^2gEUC |)`
我说几个常见的函数:
Z^h ^@:k/}x3p6X 获取最近修改时间:
:CyA CW0m J4nPCdp]
[code]<?php-k9jO!h^7G:?,HMU
$file = 'test.txt';
pxda cv_T echo date('r', filemtime($file));
J[GX'v!_ ?>[/code]
3Th Ee(f\!`4PC
C$H+M Q b'jx0F,H 返回的说unix的时间戳,这在缓存技术常用.9Ezy2{5Dd*H
,JyAm\}I;u
相关的还有获取上次被访问的时间fileatime(),filectime()当文件的权限,所有者,所有组或其它 inode 中的元数据被更新时间,fileowner()函数返回文件所有者
Z:J*mWA!D*gx b@;p4m $owner = posix_getpwuid(fileowner($file));N ~ B,P;F2C;vQ(G7D
(非window系统),ileperms()获取文件的权限,6H0D4sG,s;@,@
[code]<?php
3[2jf;S#EB,~q $file = 'dirlist.php';"P,Q:Kj:\&O-gv
$perms = substr(sprintf('%o', fileperms($file)), -4);
5@FJ/|CoqP M echo $perms;
l|6vsz1x y/zy2I ?>[/code])rT{ r.o
filesize()返回文件大小的字节数:
1N A JLJ#q/o [code]<?php u.Qo+aN
7RUw4\8X2aLa4{
// 输出类似:somefile.txt: 1024 bytes
'u ui#]k7C` H^'m m7p Wx!rJN!s
$filename = 'somefile.txt';7| n&j ]U9d0J"j&H/B+V
echo $filename . ': ' . filesize($filename) . ' bytes';
FR6VI z"yvr7p6pa s_&hyKi O
?>[/code]-B-rgB+C(BLjW6G
获取文件的全部信息有个返回数组的函数stat()函数:6t^ M4If-nGG9n
[code]<?php
WL*UM qc1@ $file = 'dirlist.php';;O7LL AM:p
$perms = stat($file);
}3DW*[L7SM var_dump($perms); r~1H\*@%g-@*M
?>[/code]
j5h/r` F(l 那个键对应什么可以查阅详细资料,此处不再展开.
|9HU3W5u3R'| y#}_!fq
四:结束语?,~3K/_ u;B\r
f/o#E-c"rI
上面我简要的总结了一下几个文件操作,如果您熟练掌握以上列出的函数,已经在操作的时候没什么大的问题,php文件操作的函数变化比较快,现在已经非常强大了,文件这部分也是学习php非常重要的一部分,希望不要忽略.

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


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