捌玖网络工作室's Archiver

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

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

  一:引论
F6t4c*].Gv:x,L)r `:@'A7P R)M$Y
  在任何计算机设备中,文件是都是必须的对象,而在web编程中,文件的操作一直是web程序员的头疼的地方,而,文件的操作在cms系统中这是必须的,非常有用的,我们经常遇到生成文件目录,文件(夹)编辑等操作,现在我把php中的这些函数做一详细总结并实例示范如何使用.,关于对应的函数详细介绍,请查阅php手册.此处只总结重点.和需要注意的地方.(这在php手册是没有的.)
z&_3z7ZU6L,^ o*g Q ^5kc7~b:zW#e
  二:目录操作
fNx2t/m}6HCB ^
yY,WS PQ$uZ*nx   首先介绍的是一个从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,而后迭代列出:
CV#cy'_ Q2u [code]<?php
0BiPZ8q(ap $base_dir    =    "filelist/";
l(Tk3V?4GO $fso        =    opendir($base_dir);
*q*vD+p9eU echo    $base_dir."<hr/>"        ;uL\ w'X_:|$~JU
while($flist=readdir($fso)){G J#|va;TpO
echo $flist."<br/>"    ;&FYB,sO/OKz1d
}
K Q[aL"S closedir($fso)9Z k;r^ x:v+f5oI3G!ij
?>[/code]
~UUR? 这是讲返回文件目录下面的文件已经目录的程序(0文件将返回false). ^E1c1K3D%Pk6}$Wy
_'h*_lR!O e9q
有时候需要知道目录的信息,可以使用dirname($path)和basename($path),分别返回路径的目录部分和文件名名称部分,可用disk_free_space($path)返回看空间空余空间. zK)t9})E,u^

e M~!Q3@U \ 创建命令:"_!m%|S6CHf
[code]mkdir($path,0777)[/code]
xB}*k+y `Re ,0777是权限码,在非window下可用umask()函数设置.
8f!h/VEH [code]rmdir($path)[/code]
UUJn OQ_8\J 将删除路径在$path的文件.
"dS N$pJ`x$M7A#M
8H-x#xDVWl6R4NT dir -- directory 类也是操作文件目录的重要类,有3个方法,read,rewind,close,这是一个仿面向对象的类,它先使用的是打开文件句柄,然后用指针的方式读取的.,这里看php手册:
1gJ if L [code]<?phpE7e*GI\_&B+V(]
$d = dir("/etc/php5");
D[/jU ~/VW~ echo "Handle: " . $d->handle . "\n";
4K X.t,j b9O lw echo "Path: " . $d->path . "\n";
j"A5}P1kq'e6m while (false !== ($entry = $d->read())) {
ny+r5XBA    echo $entry."\n";&unY7UE1U6j
}0n j4b#S X$O
$d->close();
bRs Iz5Z ?>[/code]`!_#B;cYb#@
输出:5QwAMp@` W
[code]Handle: Resource id #2x6pcZ`rX.rb]%ew$~
Path: /etc/php5
_t bf I .
,V-X9^tt1t/v m'P ..
,^jY"\5H;v apache
W:y\1`FXe cgi
!b:sZ!x+s3i*N cli[/code] y$B*ckB F7b't7m
文件的属性也非常重要,文件属性包括创建时间,最后修改时间,所有者,文件组,类型,大小等
k6N K~7l `)j
u+`viG-@&q&K_ 下面我们重点谈文件操作.
5l4Wsn#mte
E4I-RZ D_v 三:文件操作
B J!cVUH 9w@!X*O2WjYK&b
●    读文件
q;Ua3y X9r
e9s%C(|,| 首先是一个文件看能不能读取(权限问题),或者存在不,我们可以用is_readable函数获取信息.: JQD(@I'C d'}v
[code]<?php:C-m0r0BZ,|
$file = 'dirlist.php';R4YFpMj
if (is_readable($file) == false) {
`;u)Wd'{;z ^ ?^         die('文件不存在或者无法读取');
D?%^"~1L5Lf } else {
,B&vE"W:`3J ?         echo '存在';}i8Jr6f7WL D
}
&|!F0y$f-mR4X Hg6C ?>[/code]k0| [q*tX-A }
Fe]}~R Y^6j^
判断文件存在的函数还有file_exists(下面演示),但是这个显然无is_readable全面.,当一个文件存在的话可以用
qc:u0H_qg i-\w
d2?o}'TY+u$} [code]<?php;\6aL9MOg
$file = "filelist.php";
,lY0|mk ZPIu'y if (file_exists($file) == false) {
$A)pEit)J$v         die('文件不存在');&J~ \3X(j5mOH k1iw
}
:c_js'IlZ.E $data = file_get_contents($file);c/u(UhKE
echo htmlentities($data);
$L#H nhZBz A6u ?>
5^0Bp[OFNU [/code]
1k H-a%XB x 但是file_get_contents函数在较低版本上不支持,可以先创建文件的一个句柄,然后用指针读取全部:d Y\ux
,I1}[+|.Vc(g]
[code]        $fso = fopen($cacheFile, 'r');
%s'o*PxM,} U2?sa         $data = fread($fso, filesize($cacheFile));_-\ IwT `+_8l
        fclose($fso);[/code]%_-K-_Yv~
还有一种方式,可以读取二进制的文件:usTKM"HAj~#T
[code]$data = implode('', file($file));[/code]
6t#r3_vmU(v ●   写文件
)AJy |Q:P%m"m
$T$kTJg7E'~ 和读取文件的方式一样,先看看是不是能写:
C}pI(K1C
8tC YiI3s [code]<?php/}4^ guP7u\:[ z
5O+O0R sb3h&D
$file = 'dirlist.php';_%H*R.]1XfQ;D
if (is_writable($file) == false) {
1D\;ZYY1['v7f"W-sF3| Oq         die("我是鸡毛,我不能");D/\P!P'Xy[%m-|
}
J1NxI?9H a ]^ G"f;H ?>[/code]
n@8a7jW;rz*? 9G*r7wW'H6q\
能写了的话可以使用file_put_contents函数写入:.H'aA}\G.`cLO
[code]<?php#qB3{FnD
$file = 'dirlist.php';lk,Q1l?4_5Q1y|
if (is_writable($file) == false) {
,Ql"O z3DZ6JS         die('我是鸡毛,我不能');
F.J9a sBI$f2j }
Hha4XB:K:J'\ $data = '我是可鄙,我想要';
4k} {)`(Bg$B file_put_contents ($file, $data);#[w"b-xnT{^*LQ
?>[/code]
^D D"O vww \ file_put_contents函数在php5中新引进的函数(不知道存在的话用function_exists函数先判断一下)低版本的php无法使用,可以使用如下方式:}N9~:Z&WKtK1E%}2t
d'hR{N,[3q9h
[code]$f = fopen($file, 'w');:`V+} Wc]b
fwrite($f, $data);
:LK,E E-Z fclose($f);[/code]i'|0vj {a3o
#lLH%_3O9Vg
替换之..g'e;H+{?|
yZ2_#\J
写文件的时候有时候需要锁定,然后写:
4nh,o#r#`y [code]function cache_page($pageurl,$pagedata){wf-OWTTy/w
    if(!$fso=fopen($pageurl,'w')){
.b'xCW X Y         $this->warns('无法打开缓存文件.');//trigger_error
Hn,n6r;N-Mk         return false;
?QT)|\7HV     }
l?(H7\ wUq wuv&p8c     if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定
Fy%Te6icH9U$i         $this->warns('无法锁定缓存文件.');//trigger_error(e#_ y"T|K`&z+B*N
        return false;7k G*K:Bn
    }
1@%H"f]{-eEY     if(!fwrite($fso,$pagedata)){//写入字节流,serialize写入其他格式
QX6Mx(sV t`         $this->warns('无法写入缓存文件.');//trigger_errorv%S,yn OG'Dx[
        return false;%W(_@%`w}
    }GPd|"^:e
    flock($fso,LOCK_UN);//释放锁定
)o{5n!D8N m0u5WSX     fclose($fso);
F8q0s4aP:z%W0clS9z     return true;9q"s|(O7zz1?
}[/code]
#w O#vT}:w ●    复制,删除文件
}0U0W#V&zX
(] f9d%m5fz;OQ php删除文件非常easy,用unlink函数简单操作:
2vK`$\2R_^{(el qZ g*a"n S?;M%c(y
[code]<?php9E,tF:F} q`+j5|
$file = 'dirlist.php';
y7X`|Y $result = @unlink ($file);
-v/[I9rU%b if ($result == false) {z(ruo[G
        echo '蚊子赶走了';
h9Y,z!Wo } else {
Y5R"sw"];n!K         echo '无法赶走';
j*@!N9eu8Oetk }
Z4eZ uF1E3db%umG ?>[/code]_^ _ S3Hv0_1@
即可. ~p O1B JM{
p+A |\U?ML2O
复制文件也很容易:
;|EC*`+h8m.e1C 'B,g/\{LM
[code]<?php
ODE3b(F`/C $file = 'yang.txt';si9L-Ar;r)o)Jl(J
$newfile = 'ji.txt'; # 这个文件父文件夹必须能写.d(?D*^!GQ \(d9|
if (file_exists($file) == false) {
M7x[5e^hy J         die ('小样没上线,无法复制');:L+H5N_+J)|
}
\7rOH @9zq$i,Ub $result = copy($file, $newfile);
EvWc%['y;HUu if ($result == false) {?K@U:NH u
        echo '复制记忆ok';&X2_#SW!E*Y9qI
}n[D~I%i cj
?>[/code]*~^ UM;u
可以使用rename()函数重命名一个文件夹.其他操作都是这几个函数组合一下就能实现的.
-Du D-`4lh0S
JG`{ sdeK~a ●   获取文件属性
X,u yNV ,]G1m8I.C6bB(Q6|
我说几个常见的函数:7?.w rf q:Hd,m-fX
获取最近修改时间:s7x{ h!Hp
2~+x#t E I5`
[code]<?php-jW g6f D3@Y
$file = 'test.txt';!Hh:Icz
echo date('r', filemtime($file));+J&]0uL3HN;O,p%k)\ P
?>[/code]nz;B:S4Y)x^:s

K;N0^ d0~"Cn-@;b4[#l 返回的说unix的时间戳,这在缓存技术常用.
B9XODM(S/Wd 5Y jx~2^ z%Z!u/J8r
相关的还有获取上次被访问的时间fileatime(),filectime()当文件的权限,所有者,所有组或其它 inode 中的元数据被更新时间,fileowner()函数返回文件所有者
0gC{#c(?d7c8P $owner = posix_getpwuid(fileowner($file));,P;v1b3GA
(非window系统),ileperms()获取文件的权限,b7e*|{'Y
[code]<?php8nPbc{o3x$Sw
$file = 'dirlist.php';+p&u/_Le'uU X \
$perms = substr(sprintf('%o', fileperms($file)), -4);X)d4? ]"Zn
echo $perms;
/[3y?)Ev5E6Fx ?>[/code]
~rCHd0g filesize()返回文件大小的字节数:}Y"Zq Lr4L*E+q
[code]<?phpB4^7\6x~ |G$k
5]Q pz?s
// 输出类似:somefile.txt: 1024 bytes
)n um+I1a!z{ c PVQ9vO!lY&}S
$filename = 'somefile.txt';
2i2v,gZ&h echo $filename . ': ' . filesize($filename) . ' bytes';iE%H!K%n;nvB
#y2{!J+k&LA;V3x(k[
?>[/code]-h+d%|*c/PGL
获取文件的全部信息有个返回数组的函数stat()函数:y2v p LrOCz_O
[code]<?php!aI1M!r)n8qlc
$file = 'dirlist.php';]K%u(L D$H3`2@
$perms = stat($file);[M:\VE MAb
var_dump($perms);
7Fn/Zo PwY$^)RP ?>[/code]
%rP2DJs 那个键对应什么可以查阅详细资料,此处不再展开.
]"t dpw? -m.X ^[3K1YC
四:结束语7l$xg6g-X![ G

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

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


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