捌玖网络工作室's Archiver

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

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

  一:引论6qLu/awwtP/S

~"@$Y/\i;Oz   在任何计算机设备中,文件是都是必须的对象,而在web编程中,文件的操作一直是web程序员的头疼的地方,而,文件的操作在cms系统中这是必须的,非常有用的,我们经常遇到生成文件目录,文件(夹)编辑等操作,现在我把php中的这些函数做一详细总结并实例示范如何使用.,关于对应的函数详细介绍,请查阅php手册.此处只总结重点.和需要注意的地方.(这在php手册是没有的.)
$p2|l0n-L#O7? w $K*i'So myx:v E
  二:目录操作
^Kq(\^k hE
'T9nl6Ds6Vk-kI6O9~ y8Z   首先介绍的是一个从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,而后迭代列出:
^:V r*[e4e0P%g [code]<?php
*sn q+x?T $base_dir    =    "filelist/";
E.ScN&u#MF5@'I $fso        =    opendir($base_dir);
B;In? v!a~ echo    $base_dir."<hr/>"        ;z)o8_4qWL
while($flist=readdir($fso)){I;D.J%Hhl
echo $flist."<br/>"    ;
d[9@Sk8q }
f~ [9S&Y closedir($fso)6KV%N"r9g$QQ
?>[/code]Bytw Y(A
这是讲返回文件目录下面的文件已经目录的程序(0文件将返回false).
Ho)a!og#N};s Z] P3{"~+{
有时候需要知道目录的信息,可以使用dirname($path)和basename($path),分别返回路径的目录部分和文件名名称部分,可用disk_free_space($path)返回看空间空余空间.On Z#J'X-O'x
acYHhV"k
创建命令:[|+P.O'qP
[code]mkdir($path,0777)[/code]7B3DknAP
,0777是权限码,在非window下可用umask()函数设置.
o7^UQp9E:^7Q [code]rmdir($path)[/code]
p2[]"['Uxta 将删除路径在$path的文件.
t!d-[O_,q"x j
J+f(v(R w4Gb\ dir -- directory 类也是操作文件目录的重要类,有3个方法,read,rewind,close,这是一个仿面向对象的类,它先使用的是打开文件句柄,然后用指针的方式读取的.,这里看php手册:
'O|F HJ,f+eQ [code]<?phpv)D/u\6mad0~#{n
$d = dir("/etc/php5");9{g,P | t/g/LG
echo "Handle: " . $d->handle . "\n";
o]"R#lU"gv+Xyj ? echo "Path: " . $d->path . "\n";1U&b#a*r3}o5r y G
while (false !== ($entry = $d->read())) {
(mycWc    echo $entry."\n";
7Z+g |#_^ }2Z @9zX@"fz
$d->close();
k8p-{\1Fa q+` ?>[/code]+dX!sOL$i#Ns4Sb
输出:
&j{R r't6u [code]Handle: Resource id #2u(Y)z2BQx N(v
Path: /etc/php5 H1wib2bA `z6E
.$btU j er|
..
Oqhy OXyi apache;V{7dSzUC}
cgi"E~(mq{f)Yn
cli[/code]
7cS!AD FzV-D"gh 文件的属性也非常重要,文件属性包括创建时间,最后修改时间,所有者,文件组,类型,大小等
c+c }@{]/lW SU "C6~~9P4k
下面我们重点谈文件操作.J~%U5h%t O#J
X#^CHyf/?%L&u
三:文件操作 s }[0F~6lPHC
^E*N b;F%X7]
●    读文件 (?/~%Ra%R O:T
]ntdX\,j
首先是一个文件看能不能读取(权限问题),或者存在不,我们可以用is_readable函数获取信息.: a%y,p? |
[code]<?php
([m^$q@ $file = 'dirlist.php';]"jT#b"o%jJc6C'O0J0R
if (is_readable($file) == false) {
H _~&B3z         die('文件不存在或者无法读取');
b'uD|0t9x _P4t3G } else {0k#f(a/HA H
        echo '存在';D*O"A5I"}:y3]'U1lx,~
}
_ }G6q;k5Oa+gk ?>[/code]
:[8m,s4@Wg xK,JtO,]z-]c
判断文件存在的函数还有file_exists(下面演示),但是这个显然无is_readable全面.,当一个文件存在的话可以用
-whz9f9K'{k p T qw(ypd `1Q'?
[code]<?php
Xs~!O8x&F7Ue $file = "filelist.php";;m:L3`t0Y
if (file_exists($file) == false) {,D#CvH%qw
        die('文件不存在');
L7mO6C,Sb e"G!]P }*n)t-F gA(|4g
$data = file_get_contents($file);
Ena)fM5TA t,F"xG echo htmlentities($data);
3M)BmU2D-R ?>O BwP1u/o
[/code]
B*FF{&qU 但是file_get_contents函数在较低版本上不支持,可以先创建文件的一个句柄,然后用指针读取全部:H.i)G4{:BF$Xz+K
Bw0e%Tc
[code]        $fso = fopen($cacheFile, 'r');
q!G5O?dD`         $data = fread($fso, filesize($cacheFile));
9YT6hk Ii6]"\         fclose($fso);[/code]~8SZ N _d7|
还有一种方式,可以读取二进制的文件:(Z \&}&srHjZ o
[code]$data = implode('', file($file));[/code]
'cvE#K ftN ●   写文件
B!` W]"` |,c
miHo-x-eS 和读取文件的方式一样,先看看是不是能写:
I z'g^f A7Cp8e
OH|e:{3iSb [code]<?phpb4p.{ ^ l{M
z#EW!P u*t F
$file = 'dirlist.php';
4~ jDd Nsk*X(} c if (is_writable($file) == false) {
XOB4y'rR(M]0J1a,s         die("我是鸡毛,我不能"); sI#j-U+`1d@7m
}
qXPa&e@I1v6{ ?>[/code]
+Dd"QV?&GeAA x} VK5ZQ)kx2[.z _,v
能写了的话可以使用file_put_contents函数写入:7O-yt_-}4o
[code]<?php
{R+l:Hi $file = 'dirlist.php';:HHoD&Pfa_$Us,@
if (is_writable($file) == false) {
2Ha}@v         die('我是鸡毛,我不能'); }}v ];E}H
}.BT4J$V/_
$data = '我是可鄙,我想要';
q!h9N'\/U _+fLJ file_put_contents ($file, $data);8m LMs8p7P|`
?>[/code]
#}~$Wz+f?W file_put_contents函数在php5中新引进的函数(不知道存在的话用function_exists函数先判断一下)低版本的php无法使用,可以使用如下方式:7K I.[hT TH\

+aMdO*^{SP [code]$f = fopen($file, 'w');y,]K2{;c
fwrite($f, $data);
2HAg X*D,V fclose($f);[/code]
:TR ]T3T3F
|4g0cTU4C|S 替换之.\3A_k(Zwj

9dHd7BE:y+y 写文件的时候有时候需要锁定,然后写:;bs%k[*P%D c$UF
[code]function cache_page($pageurl,$pagedata){/{4mf+OWz"z9L9[
    if(!$fso=fopen($pageurl,'w')){
MP1e"xe S l2Bj         $this->warns('无法打开缓存文件.');//trigger_error
&o'Ry%pF\R&H{         return false;@_cC;s\
    }
BK,e0Q4S+SG     if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定C1FL3y!y;I5f8{eJ
        $this->warns('无法锁定缓存文件.');//trigger_error
!m"}l7{Z         return false;
S*?z??.g     }G$}oP W3A4G
    if(!fwrite($fso,$pagedata)){//写入字节流,serialize写入其他格式*c$H3u-k.?G*qV+h
        $this->warns('无法写入缓存文件.');//trigger_error
'EW*n8kA C9m         return false;
.m0e'K_v,ld`}*`Y     }
S&u0PG8}ilicC     flock($fso,LOCK_UN);//释放锁定}#_2~)u J w
    fclose($fso);
$ly!C/g1{E\     return true;\;\G[ t
}[/code]
M+^d,lj0qU3J ●    复制,删除文件
~O\#U8ye Ua\
n(Yee I O&Y$H\ php删除文件非常easy,用unlink函数简单操作:n w G` Fv Ab?

u/fDH\2t ~ ?I6Y [code]<?php
"X9pk X(na G)x%w(vL/} $file = 'dirlist.php';
o6C7M})S $result = @unlink ($file);$o*` F\VGbK o
if ($result == false) {
5or%H\I| i)OR         echo '蚊子赶走了';Bdj8du
} else {
eE3@e%Q V         echo '无法赶走';;dt}H8w
}o'l A B \#zS#{y
?>[/code]9FM)yH&F T
即可.
sZL,@:ZT.U4xR 9G(`6R;Bv
复制文件也很容易:
h4CXL]k
'^X| ~| [code]<?php
Hcm)m0S;q,G/u $file = 'yang.txt';
Q5d1KD] S $newfile = 'ji.txt'; # 这个文件父文件夹必须能写o*z@pvA
if (file_exists($file) == false) {
jbi0qF3\ d&C         die ('小样没上线,无法复制');b1e!x2w!N#| Cc1l
} _qJ;upC2f
$result = copy($file, $newfile);
/e` ?sj&S if ($result == false) {,x?u$x i1e2C_Ww
        echo '复制记忆ok';
nOg\Y7Y'_L6pr6T }
9v-I^i3S HAT4a sr ?>[/code]QPZxv*w$P1y%~$E
可以使用rename()函数重命名一个文件夹.其他操作都是这几个函数组合一下就能实现的.
.G]P)hj!m
R#mDk8C SZ E_ ●   获取文件属性 !z8K R$l o4z1o:T

0{ Uq1yp:Xkua 我说几个常见的函数:
/V u"e B B(`PM 获取最近修改时间:W#a)Ab` N8M
;FZ1og/V
[code]<?php
&@j3}d5^ $file = 'test.txt';1B-b@ O(G7HC/o
echo date('r', filemtime($file));
E,aIEe ?>[/code]|Z&a5C?&@|u/~:}h

0w4Dc&{0?a;| 返回的说unix的时间戳,这在缓存技术常用.
av7F,Of$~ {
qP,_5UM/{6csA 相关的还有获取上次被访问的时间fileatime(),filectime()当文件的权限,所有者,所有组或其它 inode 中的元数据被更新时间,fileowner()函数返回文件所有者
8s*\"g,K%X.}2O $owner = posix_getpwuid(fileowner($file));
2NGa.r L{ wp^!l (非window系统),ileperms()获取文件的权限,
]f"@E8S5T [code]<?php
/o"WfmYg2V(H4ZJ $file = 'dirlist.php';x'J-L![ N'jM
$perms = substr(sprintf('%o', fileperms($file)), -4);
cm(EH2V8};S'o2l\1d echo $perms;0R}8\6m Q
?>[/code]
Ul1~FC2i4c2c1{(V filesize()返回文件大小的字节数:
XBSKB s [code]<?php
^;Y3CH:G+j:`&B-| bP2YtU
// 输出类似:somefile.txt: 1024 bytes
*uR3T6Tq zX!q HXk V3VIS
$filename = 'somefile.txt';rQ|fyF-u'G*T
echo $filename . ': ' . filesize($filename) . ' bytes';^+l6@%Q~Cjq

H:x8@Lk ?>[/code]
1x/j1pa x M J-xKA 获取文件的全部信息有个返回数组的函数stat()函数:yhGw{D3V
[code]<?php
j O'r4a5\w{)[W{/X $file = 'dirlist.php'; tZ&Sgjg%E3l
$perms = stat($file);
c4NemfE,P2{|i var_dump($perms);
TDx.Qu;[ ?>[/code]
8wdA#V.{TO? 那个键对应什么可以查阅详细资料,此处不再展开.8C&vNoi c8V"|b-o
"P.v1K*~ y;p7JdS
四:结束语
f4W V4m(dHKM;L !R*S$p} l
上面我简要的总结了一下几个文件操作,如果您熟练掌握以上列出的函数,已经在操作的时候没什么大的问题,php文件操作的函数变化比较快,现在已经非常强大了,文件这部分也是学习php非常重要的一部分,希望不要忽略.

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


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