返回列表 发帖

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

  一:引论% m8 Z  ]  H& z

$ e/ M% C9 F9 y9 ]  在任何计算机设备中,文件是都是必须的对象,而在web编程中,文件的操作一直是web程序员的头疼的地方,而,文件的操作在cms系统中这是必须的,非常有用的,我们经常遇到生成文件目录,文件(夹)编辑等操作,现在我把php中的这些函数做一详细总结并实例示范如何使用.,关于对应的函数详细介绍,请查阅php手册.此处只总结重点.和需要注意的地方.(这在php手册是没有的.)
& n& [, G2 f9 k. z( V0 [% k
0 d$ |' w- d8 t$ y1 A  二:目录操作
1 |& U# j' R; f: O' \, ?& u/ T4 E0 @6 x
  首先介绍的是一个从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,而后迭代列出:
7 {& o; z% x  r3 W
  1. <?php
  2. $base_dir    =    "filelist/";
  3. $fso        =    opendir($base_dir);
  4. echo    $base_dir."<hr/>"        ;
  5. while($flist=readdir($fso)){
  6. echo $flist."<br/>"    ;
  7. }
  8. closedir($fso)
  9. ?>
复制代码

- Q9 |8 ?& C6 @这是讲返回文件目录下面的文件已经目录的程序(0文件将返回false).
) E1 c8 P4 f8 p- a( H; ]* R  i3 N% K) H
有时候需要知道目录的信息,可以使用dirname($path)和basename($path),分别返回路径的目录部分和文件名名称部分,可用disk_free_space($path)返回看空间空余空间.
. ?! c3 [1 D  V% A/ g, a2 v/ ?, u1 ?3 U$ D" Q; i+ g* ?
创建命令:% u: D# L( s( p3 _+ L0 z4 f
  1. mkdir($path,0777)
复制代码
( R$ Z. Q' q8 U# j
,0777是权限码,在非window下可用umask()函数设置.3 b- m3 g* D# {7 I9 \, _0 T3 a
  1. rmdir($path)
复制代码

# U5 B# ?. J9 A3 ?: ~将删除路径在$path的文件.
1 U( J/ K) ]. d: |8 P1 x4 K1 f/ J& z7 v- R0 t& z6 |
dir -- directory 类也是操作文件目录的重要类,有3个方法,read,rewind,close,这是一个仿面向对象的类,它先使用的是打开文件句柄,然后用指针的方式读取的.,这里看php手册:- ?: c4 U1 l; N* P# X8 l4 H
  1. <?php
  2. $d = dir("/etc/php5");
  3. echo "Handle: " . $d->handle . "\n";
  4. echo "Path: " . $d->path . "\n";
  5. while (false !== ($entry = $d->read())) {
  6.    echo $entry."\n";
  7. }
  8. $d->close();
  9. ?>
复制代码
& ^0 Z* |' ^! ]/ y
输出:
8 f# C4 _; y1 e& w; }
  1. Handle: Resource id #2
  2. Path: /etc/php5
  3. .
  4. ..
  5. apache
  6. cgi
  7. cli
复制代码

& N0 `. I. B8 k- P文件的属性也非常重要,文件属性包括创建时间,最后修改时间,所有者,文件组,类型,大小等
: ?5 Z! {$ J3 l" O6 f+ |5 Z
. _: H, C5 u. |: S$ m下面我们重点谈文件操作.
( z, O9 G: N$ ~5 o2 r1 j5 t6 T/ V6 e# s$ O( q4 H
三:文件操作
% o5 X. T! s4 ~) I! c9 z
' s8 q1 Q4 o& o/ K+ V1 p●    读文件 ( y3 [- o+ f# m' a+ k$ _

# H( ]0 ?: P9 D: r" Z- ~+ _# o) ]+ o首先是一个文件看能不能读取(权限问题),或者存在不,我们可以用is_readable函数获取信息.:
* |( H+ s9 r8 w) P9 _' G
  1. <?php
  2. $file = 'dirlist.php';
  3. if (is_readable($file) == false) {
  4.         die('文件不存在或者无法读取');
  5. } else {
  6.         echo '存在';
  7. }
  8. ?>
复制代码
: t. h0 ^  q. Q: h8 q: }

+ f( m' |5 d9 i/ `8 ]$ [8 D9 _判断文件存在的函数还有file_exists(下面演示),但是这个显然无is_readable全面.,当一个文件存在的话可以用
6 M% u( P6 D, }- }! s+ p+ @0 G' P7 o$ |- d8 s+ j0 S
  1. <?php
  2. $file = "filelist.php";
  3. if (file_exists($file) == false) {
  4.         die('文件不存在');
  5. }
  6. $data = file_get_contents($file);
  7. echo htmlentities($data);
  8. ?>
复制代码
9 P# Y# E8 n+ C# k. y7 _. j# ~5 z
但是file_get_contents函数在较低版本上不支持,可以先创建文件的一个句柄,然后用指针读取全部:
, T1 s3 \3 `' d3 h( n/ H
0 y( ^/ Y, }2 @* h) L% ~0 l
  1.         $fso = fopen($cacheFile, 'r');
  2.         $data = fread($fso, filesize($cacheFile));
  3.         fclose($fso);
复制代码
- O5 L8 R. r; r9 q
还有一种方式,可以读取二进制的文件:. z# N7 |! L( x/ W
  1. $data = implode('', file($file));
复制代码
5 F5 p& l" R4 x. a$ b: n( B
●   写文件 3 ?" }- T* s0 m1 K1 @

+ g$ }7 w% ?* A4 [8 O6 L0 N2 Y和读取文件的方式一样,先看看是不是能写:$ S# g$ a# n# Q, |( z' P4 r

1 k; K3 G+ `+ \& q
  1. <?php

  2. $file = 'dirlist.php';
  3. if (is_writable($file) == false) {
  4.         die("我是鸡毛,我不能");
  5. }
  6. ?>
复制代码

6 P" n' P( z0 N2 |6 S, I3 @4 C" h% q6 X, x
能写了的话可以使用file_put_contents函数写入:
+ n/ b4 D/ U& k/ C' A9 G/ F
  1. <?php
  2. $file = 'dirlist.php';
  3. if (is_writable($file) == false) {
  4.         die('我是鸡毛,我不能');
  5. }
  6. $data = '我是可鄙,我想要';
  7. file_put_contents ($file, $data);
  8. ?>
复制代码
4 K0 H0 Z' s2 V9 g( s6 H: `/ l
file_put_contents函数在php5中新引进的函数(不知道存在的话用function_exists函数先判断一下)低版本的php无法使用,可以使用如下方式:
/ f8 _& y& ?; v7 A4 k! r1 c9 m* Z. l  H* }' p/ o6 K
  1. $f = fopen($file, 'w');
  2. fwrite($f, $data);
  3. fclose($f);
复制代码

' i+ [. c7 e3 d' ~( j5 ^# y. N) s; w1 i9 V; R$ h3 @5 P
替换之.
2 b; }4 E  o, Y3 v% g
+ S1 H7 H1 d* G7 s& S8 h写文件的时候有时候需要锁定,然后写:
* n( C. h2 W0 L4 X9 C2 c
  1. function cache_page($pageurl,$pagedata){
  2.     if(!$fso=fopen($pageurl,'w')){
  3.         $this->warns('无法打开缓存文件.');//trigger_error
  4.         return false;
  5.     }
  6.     if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定
  7.         $this->warns('无法锁定缓存文件.');//trigger_error
  8.         return false;
  9.     }
  10.     if(!fwrite($fso,$pagedata)){//写入字节流,serialize写入其他格式
  11.         $this->warns('无法写入缓存文件.');//trigger_error
  12.         return false;
  13.     }
  14.     flock($fso,LOCK_UN);//释放锁定
  15.     fclose($fso);
  16.     return true;
  17. }
复制代码
8 E% [0 `. w+ l7 {* H
●    复制,删除文件 % O1 q4 X" U% Y# f& v

2 F% Y3 E1 E# `! B6 r& Hphp删除文件非常easy,用unlink函数简单操作:& e( T' V1 r% I) I# d3 ^
% A. @- E( r9 Q6 f; r
  1. <?php
  2. $file = 'dirlist.php';
  3. $result = @unlink ($file);
  4. if ($result == false) {
  5.         echo '蚊子赶走了';
  6. } else {
  7.         echo '无法赶走';
  8. }
  9. ?>
复制代码

1 d# G, U3 [2 _. m+ ^. t即可.
3 c# [) L) q0 s" I( }; I7 {' k7 B/ U( I
复制文件也很容易:
4 q- q' @! ^! ^! j# X' r: N( ^
3 K1 l6 k( D" y4 h$ D
  1. <?php
  2. $file = 'yang.txt';
  3. $newfile = 'ji.txt'; # 这个文件父文件夹必须能写
  4. if (file_exists($file) == false) {
  5.         die ('小样没上线,无法复制');
  6. }
  7. $result = copy($file, $newfile);
  8. if ($result == false) {
  9.         echo '复制记忆ok';
  10. }
  11. ?>
复制代码

; E& K5 l# d) e! _0 [1 l  }, [可以使用rename()函数重命名一个文件夹.其他操作都是这几个函数组合一下就能实现的.- g# R5 _$ ?) A

8 x$ O+ K* r+ l/ r●   获取文件属性 7 [6 y2 G) ~, L
+ U$ b# I% E' W; N6 }  I9 F/ H  v
我说几个常见的函数:& k1 R$ X2 M1 C5 k1 d" M
获取最近修改时间:! ~3 e8 s1 s1 d5 ~6 [

' ]$ t6 I, i8 Q) D% |
  1. <?php
  2. $file = 'test.txt';
  3. echo date('r', filemtime($file));
  4. ?>
复制代码

, x5 w/ n, J- x2 Y8 W7 B5 Y: j3 X5 }$ p2 l3 T4 |
返回的说unix的时间戳,这在缓存技术常用.
  P) @# H' u  x6 A2 @% D" E$ V$ k2 R8 G5 N0 |, P8 H2 n3 o! t3 K
相关的还有获取上次被访问的时间fileatime(),filectime()当文件的权限,所有者,所有组或其它 inode 中的元数据被更新时间,fileowner()函数返回文件所有者
7 o$ ?; k7 Q  c" s! i$owner = posix_getpwuid(fileowner($file));2 a# A2 c/ z. \' V' m
(非window系统),ileperms()获取文件的权限,4 ]$ R% `: g, ^, v- y: v
  1. <?php
  2. $file = 'dirlist.php';
  3. $perms = substr(sprintf('%o', fileperms($file)), -4);
  4. echo $perms;
  5. ?>
复制代码
6 R2 e5 m! J/ g: `3 G
filesize()返回文件大小的字节数:& d+ w* p% e1 W+ b% t
  1. <?php

  2. // 输出类似:somefile.txt: 1024 bytes

  3. $filename = 'somefile.txt';
  4. echo $filename . ': ' . filesize($filename) . ' bytes';

  5. ?>
复制代码

! A7 z, ^/ U- U9 N- _( y) G/ |3 l获取文件的全部信息有个返回数组的函数stat()函数:
' o. k/ u5 ]) E* W4 O4 O0 o7 b
  1. <?php
  2. $file = 'dirlist.php';
  3. $perms = stat($file);
  4. var_dump($perms);
  5. ?>
复制代码

- }$ R. e( W& s+ w# z$ I那个键对应什么可以查阅详细资料,此处不再展开.3 L, l, D- u' s' d. B) t
+ s" Q8 w9 U( V( Q% u, S2 T* J+ V
四:结束语
- }/ Q; a( i9 |( l3 _
7 j. F: m! S' P( D( B3 V0 g上面我简要的总结了一下几个文件操作,如果您熟练掌握以上列出的函数,已经在操作的时候没什么大的问题,php文件操作的函数变化比较快,现在已经非常强大了,文件这部分也是学习php非常重要的一部分,希望不要忽略.

返回列表
【捌玖网络】已经运行: