捌玖网络工作室's Archiver

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

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

  一:引论3a bhC([8fr\

$h(l(m_ O]   在任何计算机设备中,文件是都是必须的对象,而在web编程中,文件的操作一直是web程序员的头疼的地方,而,文件的操作在cms系统中这是必须的,非常有用的,我们经常遇到生成文件目录,文件(夹)编辑等操作,现在我把php中的这些函数做一详细总结并实例示范如何使用.,关于对应的函数详细介绍,请查阅php手册.此处只总结重点.和需要注意的地方.(这在php手册是没有的.)
Ki;kb2H-A &| rmn+f
  二:目录操作om;Ht t-y,b.U ?

N"A d3`-i9c {/T   首先介绍的是一个从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,而后迭代列出:j1Q(Vq*?b
[code]<?phpta*M#~(H)A
$base_dir    =    "filelist/";
*bT-IC ` $fso        =    opendir($base_dir);*}q_#z{
echo    $base_dir."<hr/>"        ;] F0^:Y'V[
while($flist=readdir($fso)){IdagQ5|Cu
echo $flist."<br/>"    ;a }[ xZaP|q9h
}._q;`{(p3d5?
closedir($fso)Z:C;j d;i~
?>[/code]FR/upm | Ub
这是讲返回文件目录下面的文件已经目录的程序(0文件将返回false).:lxW+uLK y

)K#o ]b^o,Jm 有时候需要知道目录的信息,可以使用dirname($path)和basename($path),分别返回路径的目录部分和文件名名称部分,可用disk_free_space($path)返回看空间空余空间.nO|k,?/l(B

+a3@k1C3A.N#A 创建命令:a)H'hA.g4YhZ)@JXiH
[code]mkdir($path,0777)[/code]4Q F}eTF6DM
,0777是权限码,在非window下可用umask()函数设置.u8pZJ @l C~H!pL
[code]rmdir($path)[/code]
!l1{m'n\aR 将删除路径在$path的文件.6fOdHQu

jm2ex,S!pKg4W dir -- directory 类也是操作文件目录的重要类,有3个方法,read,rewind,close,这是一个仿面向对象的类,它先使用的是打开文件句柄,然后用指针的方式读取的.,这里看php手册:Zmz`9F,J/Ete?7Wf
[code]<?phpdO)[Nb3mLE.K
$d = dir("/etc/php5");5Y,Et3p+c!~
echo "Handle: " . $d->handle . "\n";
:m^P{e echo "Path: " . $d->path . "\n";$RCr9M0lE
while (false !== ($entry = $d->read())) {B.w H:]Fl!{6f6wD
   echo $entry."\n";D/Y!g&DF%a D)G Yf
}$h.oyG7F _GB
$d->close();
N%Tg*NI%}LW+y ?>[/code]
;ER)}+@-c 输出:
uR(B&b,f3uU'O [code]Handle: Resource id #2&qhvaIS
Path: /etc/php5!{}3d(j(VWl9a.L
.n/LNO"r!D@
..rP&EKW6I$y8A
apache
9vu7f'But;i cgi Q}5[ |/RFs
cli[/code]Y,P IqVP
文件的属性也非常重要,文件属性包括创建时间,最后修改时间,所有者,文件组,类型,大小等,|!x)rN:E"n
/rbs1YO;dZD+Zk d
下面我们重点谈文件操作.
3u|t%q-v6e[ s
5bxEao*P 三:文件操作
i,np5_G5@/c ug%V jb$y ?X
●    读文件 *t%h%K%l*o*C8G
x+zi-p$I+\
首先是一个文件看能不能读取(权限问题),或者存在不,我们可以用is_readable函数获取信息.: S/Eq]H
[code]<?php
cp-n dJ,Rv)~V $file = 'dirlist.php';
jR[\bg if (is_readable($file) == false) {
[BN m.GN~)[$oI         die('文件不存在或者无法读取');
;l HM!`%dm } else {
3DB{S$VBNvR         echo '存在';
8YG9N9l0i1D.S&`l }
e aN)z`GLW ?>[/code]5?5j$}T uV"]6s#d6Oh

%f#[;?a+| 判断文件存在的函数还有file_exists(下面演示),但是这个显然无is_readable全面.,当一个文件存在的话可以用JpI.DgoK
YrU7b&Y
[code]<?phpk;H-g"h;m
$file = "filelist.php";*k9cXOn?z ~ o
if (file_exists($file) == false) { Xw2bA3U|
        die('文件不存在');
S*[y!t{5AP }Q YU'e [*D4M
$data = file_get_contents($file);9p{m7r$czxXn*sQ
echo htmlentities($data);
dxN m,z-{ ?>D4@nk8W9Ffd
[/code]
8KJ)ps!Y qm 但是file_get_contents函数在较低版本上不支持,可以先创建文件的一个句柄,然后用指针读取全部:
,g py*x8i 8s/Mk#O6M4zV-M&v
[code]        $fso = fopen($cacheFile, 'r');\oIZ p9SG
        $data = fread($fso, filesize($cacheFile));f8t,H+Lyc\&{ i)P
        fclose($fso);[/code]
%QzaI#Ed}aq 还有一种方式,可以读取二进制的文件:
+ZZ\ |g~#WA [code]$data = implode('', file($file));[/code]]*CnLdVB
●   写文件 r K6r;ZM^k"f ~(XV

,D&s'S&j&`p}q 和读取文件的方式一样,先看看是不是能写:~L9T4?5P i,xHsk,_Q
(S t4d7uR;OqbW H^
[code]<?phpLen7Vam ^

i v9hKC.i $file = 'dirlist.php';
WCqhs7x2{P/|&|Gs if (is_writable($file) == false) {*VS)o*W RAv-ib6N
        die("我是鸡毛,我不能");
w(]/Y)\!Tu }J'O!E1ZRp$A5f
?>[/code]_8{$^(H,i

,?a&VB]s})l 能写了的话可以使用file_put_contents函数写入:%XD(or2w
[code]<?php
R0FLn!uf(G? $file = 'dirlist.php';
Uv+b?8b5v if (is_writable($file) == false) {y&N3k/["YI @t
        die('我是鸡毛,我不能');
;ddAxd+O }|3L V+N4^2]%X
$data = '我是可鄙,我想要';EM'yh\"?\4j
file_put_contents ($file, $data);Y?H-kRvx4x
?>[/code] JmzKt!en6A*?bJ
file_put_contents函数在php5中新引进的函数(不知道存在的话用function_exists函数先判断一下)低版本的php无法使用,可以使用如下方式: wYFOs2zX]

y"^:v4yl [code]$f = fopen($file, 'w');w8A&pG1n(R
fwrite($f, $data);
]K)pA'm fclose($f);[/code].gf?:a P&J:W){p r;y

*V"eSx9A2u 替换之.)~X*xH8o| ^2K|

+{sw(b ~L 写文件的时候有时候需要锁定,然后写:AL.bC-z[i
[code]function cache_page($pageurl,$pagedata){
iUE l8l(oi3r     if(!$fso=fopen($pageurl,'w')){
r!tC.|;Q Q?o         $this->warns('无法打开缓存文件.');//trigger_error
&Q5c W _UN)]/u h         return false;
~:P0q1M~u5i-~D     }
o+p*AV[ T&{     if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定&Z"jpw H
        $this->warns('无法锁定缓存文件.');//trigger_errorq&QD"ca)gz3QRs
        return false;]%dr/i7]
    }
n8g,M~X Aj&T     if(!fwrite($fso,$pagedata)){//写入字节流,serialize写入其他格式
3@8Lt#xf&y         $this->warns('无法写入缓存文件.');//trigger_errorZ:v,qb\.c3O8D8?p[
        return false;c,sL*n/B-LX:v%{R
    }S2m;W1x[Z
    flock($fso,LOCK_UN);//释放锁定
n^1j2\}Gp't     fclose($fso);
.~7O&yd,Q"B     return true;7N6v!q+t y_%xr*C
}[/code]
,xO~Q r8Z ●    复制,删除文件 n8h2p;RU0{hi:B&?

7O `&M|7R#H5x-Kr,ll php删除文件非常easy,用unlink函数简单操作:
*~N'P0Nw;K)L ,l9e:aZ\]/M
[code]<?php|4f1N^2H7c
$file = 'dirlist.php';$`"W;ybm
$result = @unlink ($file);
yE2eP-d!V }1T if ($result == false) {z\+K*L k'mN
        echo '蚊子赶走了';
5CV nQ*r n;{ FHo$An } else {N:X+K/rB J~
        echo '无法赶走';7OQ@/Ex!s X@
} Zd%m$Yh]U
?>[/code]
a%]Y5Hq1vCPU 即可..y @7q ~v[C
B,}9pQ#c
复制文件也很容易:
R8f;z!AwX
MR@6y|b&RUT-k [code]<?php Z)O uG$@~!TE_{
$file = 'yang.txt';W.BoW(Y"w:[g3`
$newfile = 'ji.txt'; # 这个文件父文件夹必须能写} `dy-RhN8o
if (file_exists($file) == false) {
^"p9sn q*M'tT `|         die ('小样没上线,无法复制');
9U;?!R'{yX7kn4d }
*^0Ym"?%G h `!A $result = copy($file, $newfile);)ZR GaY~U
if ($result == false) {:D/S.I;tz1hy+}l
        echo '复制记忆ok';Q*J4Q+zn
}
l(a%F7D U-| ?>[/code]
nu#\H3z qP/e Q@ 可以使用rename()函数重命名一个文件夹.其他操作都是这几个函数组合一下就能实现的.
6bt k2j!`(N 2yO%HkmW_#K!CL
●   获取文件属性 IQ)bx Ei3MjneN
M1B;K3p#t$rB/{A g
我说几个常见的函数:
3QU-[[NQ2m 获取最近修改时间:
3|8MX G7KvV +~g n$t _sk4RN
[code]<?phpo-d)~)AfML-l
$file = 'test.txt';&` yk ^ B|!Mg.G
echo date('r', filemtime($file));}1o!EG#p+Ab
?>[/code]FQ2Wn8Q)y^
.M)S:j&~u
返回的说unix的时间戳,这在缓存技术常用.h|B)~ x
pc-cdq8~ `c
相关的还有获取上次被访问的时间fileatime(),filectime()当文件的权限,所有者,所有组或其它 inode 中的元数据被更新时间,fileowner()函数返回文件所有者 4f4xh(c#Z/k
$owner = posix_getpwuid(fileowner($file));
3Lg{[3L'e0s;C (非window系统),ileperms()获取文件的权限,Ie*s1poxJ6Q
[code]<?phpGvE b7Qv
$file = 'dirlist.php';
|'x0e@%[4K $perms = substr(sprintf('%o', fileperms($file)), -4);+Qj#UWO `-{`_+KW
echo $perms;
B s/p UV0@e9ql ?>[/code]
{@B!{y*MC filesize()返回文件大小的字节数:
5kB,X^ P D5Hf3k [code]<?php
!S!D nd)a'x
"op z-]g // 输出类似:somefile.txt: 1024 bytes
@i [B9n;`
UX"eCo `!}9t $filename = 'somefile.txt';A$uL poq`m_
echo $filename . ': ' . filesize($filename) . ' bytes';
Z:j|Ys]l U4C E+Y V
?>[/code]TLGk9q7b`_:z
获取文件的全部信息有个返回数组的函数stat()函数:
}!@cr;iK [code]<?php
K`0FK!V1e I1| $file = 'dirlist.php';
2?+c L | GN;M.t/g,y $perms = stat($file);4GY^4X3x0h3\
var_dump($perms);!p0gW#L#Vc2Yr
?>[/code]
{nX7I4ubF^wUpY 那个键对应什么可以查阅详细资料,此处不再展开.
$\pbh CY`*V9|'J\Y-k 1? CpA2N;S F
四:结束语
6HY;{.r;o0s
}x1N yl)a3i 上面我简要的总结了一下几个文件操作,如果您熟练掌握以上列出的函数,已经在操作的时候没什么大的问题,php文件操作的函数变化比较快,现在已经非常强大了,文件这部分也是学习php非常重要的一部分,希望不要忽略.

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


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