返回列表 发帖

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

  一:引论( a2 \7 K& i6 G) u  N$ w
; f* P) |# J; b6 [, y& A
  在任何计算机设备中,文件是都是必须的对象,而在web编程中,文件的操作一直是web程序员的头疼的地方,而,文件的操作在cms系统中这是必须的,非常有用的,我们经常遇到生成文件目录,文件(夹)编辑等操作,现在我把php中的这些函数做一详细总结并实例示范如何使用.,关于对应的函数详细介绍,请查阅php手册.此处只总结重点.和需要注意的地方.(这在php手册是没有的.)
% n9 G8 k! E; _7 b; g0 m5 f* {+ B$ ]3 p  `
  二:目录操作
; J5 m5 t% E+ Q3 [( V+ @! n3 {$ Y! V' x# u& q
  首先介绍的是一个从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,而后迭代列出:
- ]) c3 j* D4 T" ~4 M0 B: L
  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. ?>
复制代码

7 g2 q, j, C( Z: c# f4 P2 X: V* B这是讲返回文件目录下面的文件已经目录的程序(0文件将返回false).
2 m: y9 q3 D' i+ X
+ j4 z: G1 [3 _, Q/ h有时候需要知道目录的信息,可以使用dirname($path)和basename($path),分别返回路径的目录部分和文件名名称部分,可用disk_free_space($path)返回看空间空余空间.
2 L- f8 N' B) |5 d2 s  P* U% `3 x' C5 w) Y! `! D7 E
创建命令:5 p: B' S4 K3 o5 Y
  1. mkdir($path,0777)
复制代码
0 o6 Y7 u6 e, X6 |3 E* X0 V; R
,0777是权限码,在非window下可用umask()函数设置.7 R. g( p8 H$ N8 }
  1. rmdir($path)
复制代码

1 H! _& i. Y" p/ {' v将删除路径在$path的文件.5 x. d6 |. U6 k7 e3 z2 r# A# @3 G# u4 O
- E2 z2 a  b! g0 V8 y& X) S+ N
dir -- directory 类也是操作文件目录的重要类,有3个方法,read,rewind,close,这是一个仿面向对象的类,它先使用的是打开文件句柄,然后用指针的方式读取的.,这里看php手册:9 v' [. a( L: z0 W0 X. M
  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. ?>
复制代码
7 S+ m) `+ i6 w  z( d6 c
输出:4 B! ^4 L8 y2 p/ b# y4 L+ j: x! L
  1. Handle: Resource id #2
  2. Path: /etc/php5
  3. .
  4. ..
  5. apache
  6. cgi
  7. cli
复制代码

2 v1 \( `+ w  q- D文件的属性也非常重要,文件属性包括创建时间,最后修改时间,所有者,文件组,类型,大小等, R9 P, J4 w2 p2 Y

. d" p# Y% w: i3 |& w+ J3 O下面我们重点谈文件操作.! y: H* a/ i- I2 S8 q. Q

% X. F7 B! d' i6 k三:文件操作
9 J0 Q) L$ ^  U9 M5 ~9 \+ l! S' A1 a  o2 ^
●    读文件
  V; \  e) X( [3 v" ]$ z7 ~
9 K3 }: G. B! u  _* A首先是一个文件看能不能读取(权限问题),或者存在不,我们可以用is_readable函数获取信息.: % j7 f7 D6 j& ^# X
  1. <?php
  2. $file = 'dirlist.php';
  3. if (is_readable($file) == false) {
  4.         die('文件不存在或者无法读取');
  5. } else {
  6.         echo '存在';
  7. }
  8. ?>
复制代码

) j& E8 v& h4 T. z
" w& l- h5 @( [2 W" b5 i4 m6 @判断文件存在的函数还有file_exists(下面演示),但是这个显然无is_readable全面.,当一个文件存在的话可以用4 v) g# [- g: L( C# u
+ j7 H$ ]4 C- c$ f: g: @5 j" n
  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. ?>
复制代码

3 S: c$ [- c* H/ X- z5 _: b' w但是file_get_contents函数在较低版本上不支持,可以先创建文件的一个句柄,然后用指针读取全部:
, |/ l0 Z2 ?, c$ {. R
$ u0 e+ a% k+ o+ ^- C3 @1 P8 T
  1.         $fso = fopen($cacheFile, 'r');
  2.         $data = fread($fso, filesize($cacheFile));
  3.         fclose($fso);
复制代码
; V4 c# }" U8 T
还有一种方式,可以读取二进制的文件:
- v- f" K9 P$ W
  1. $data = implode('', file($file));
复制代码
; x# N9 X' E  x7 t, Y
●   写文件 . G+ m# o" m% p7 A: @; Q

' \& Q8 M. z! v和读取文件的方式一样,先看看是不是能写:
3 d1 j  b$ x( |  ]. C7 p1 l  I+ v/ n7 J' w: G- O7 ~
  1. <?php

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

% d: Q- T: n5 s& A  ~. r  C3 V# ?9 Q& l2 v( _3 \
能写了的话可以使用file_put_contents函数写入:. P. y* X) f5 _1 q
  1. <?php
  2. $file = 'dirlist.php';
  3. if (is_writable($file) == false) {
  4.         die('我是鸡毛,我不能');
  5. }
  6. $data = '我是可鄙,我想要';
  7. file_put_contents ($file, $data);
  8. ?>
复制代码
. l) z' L% c0 M# _' p) t3 K% P0 a
file_put_contents函数在php5中新引进的函数(不知道存在的话用function_exists函数先判断一下)低版本的php无法使用,可以使用如下方式:
1 ]& f2 A5 O9 D0 |. m  P9 l7 C. f0 Z7 E( \7 p! e3 K
  1. $f = fopen($file, 'w');
  2. fwrite($f, $data);
  3. fclose($f);
复制代码
' G+ D3 ?" d: l, r; L( x2 N) M

) t6 [' P* `6 C4 \3 ^替换之.
0 R' i% V- p1 T, ^* R7 r) x1 q7 T7 G3 `  K9 ~9 \
写文件的时候有时候需要锁定,然后写:
8 y$ T9 W# o/ S) H9 T1 {  r! B
  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. }
复制代码

2 g: l4 ]! J6 Q2 O4 x! X" d●    复制,删除文件
( H# K& P( `# e' h: `
+ `! K' G9 q6 \) y2 h; rphp删除文件非常easy,用unlink函数简单操作:! ]' a) {. q' j- n6 q% R7 o* |
6 j, i) o! [$ a$ s2 |
  1. <?php
  2. $file = 'dirlist.php';
  3. $result = @unlink ($file);
  4. if ($result == false) {
  5.         echo '蚊子赶走了';
  6. } else {
  7.         echo '无法赶走';
  8. }
  9. ?>
复制代码
7 O% H% ]% i3 o& M" H( _
即可.
! \* x3 j% Q# ]: N8 g) v' y8 K1 D( S" A1 u0 I# B$ g
复制文件也很容易:
% m+ d1 t6 T- J3 e$ X9 ]' s$ g8 S# u" f4 s
  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. ?>
复制代码
6 m' H) L) g0 A$ N) K
可以使用rename()函数重命名一个文件夹.其他操作都是这几个函数组合一下就能实现的.$ ?# H& p9 F2 P( {7 H! h

+ u6 {& R* v$ u. e. M  O●   获取文件属性 : Y; B. w. [: U& o+ Q9 X( }+ B
! ]% ~0 S. ]. B. Z
我说几个常见的函数:5 v+ ~; a6 e0 [1 W% S3 m
获取最近修改时间:  U) [6 S( r0 p- X( A3 \
5 Y! C' q, s# ~" @8 C* W+ ]8 q% m
  1. <?php
  2. $file = 'test.txt';
  3. echo date('r', filemtime($file));
  4. ?>
复制代码
0 D# w+ y' r0 V* \, j
) a& E) K; ?8 p0 B
返回的说unix的时间戳,这在缓存技术常用.
3 @5 e6 }" G6 n3 ^( f. m  x: [4 R! a" f. P" t# o0 P
相关的还有获取上次被访问的时间fileatime(),filectime()当文件的权限,所有者,所有组或其它 inode 中的元数据被更新时间,fileowner()函数返回文件所有者   X, I& `4 l  i3 `* a8 o  y( ]7 ^
$owner = posix_getpwuid(fileowner($file));2 [6 r$ P' g' }+ k/ }5 K
(非window系统),ileperms()获取文件的权限,
( ~9 s! L2 C- l* ]5 L
  1. <?php
  2. $file = 'dirlist.php';
  3. $perms = substr(sprintf('%o', fileperms($file)), -4);
  4. echo $perms;
  5. ?>
复制代码

# Q: e+ p1 K% q( r, J( ffilesize()返回文件大小的字节数:) H) b& U; H$ B
  1. <?php

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

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

  5. ?>
复制代码

2 u( o# d! \$ w6 P  E6 N获取文件的全部信息有个返回数组的函数stat()函数:8 X. L, l) R% s4 y
  1. <?php
  2. $file = 'dirlist.php';
  3. $perms = stat($file);
  4. var_dump($perms);
  5. ?>
复制代码

( S% y* f9 ?( X% t那个键对应什么可以查阅详细资料,此处不再展开.
* o6 u1 f8 K5 u, J+ Q& K
$ X- R. w1 [' G/ N四:结束语
# M# V! T! \9 e8 J( w% J% p" ~+ j3 v5 c, G- N
上面我简要的总结了一下几个文件操作,如果您熟练掌握以上列出的函数,已经在操作的时候没什么大的问题,php文件操作的函数变化比较快,现在已经非常强大了,文件这部分也是学习php非常重要的一部分,希望不要忽略.

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