Board logo

标题: 详细学习PHP中对文件和目录的操作方法 [打印本页]

作者: admin    时间: 2007-11-17 09:00     标题: 详细学习PHP中对文件和目录的操作方法

  一:引论
9 E# R. v# e. j0 X
% d( b0 Z! \; f. C) T/ W  在任何计算机设备中,文件是都是必须的对象,而在web编程中,文件的操作一直是web程序员的头疼的地方,而,文件的操作在cms系统中这是必须的,非常有用的,我们经常遇到生成文件目录,文件(夹)编辑等操作,现在我把php中的这些函数做一详细总结并实例示范如何使用.,关于对应的函数详细介绍,请查阅php手册.此处只总结重点.和需要注意的地方.(这在php手册是没有的.)- @" s, ~6 `& A& ?7 T6 w  E+ P
7 A( \+ s+ L' ?9 e
  二:目录操作
9 C1 [$ X! V1 j- r9 l% f8 W" a" [  p! o* F: g3 N
  首先介绍的是一个从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,而后迭代列出:
, G$ N( T: W  Z
  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. ?>
复制代码
* P% `( G3 S0 `, ~/ A
这是讲返回文件目录下面的文件已经目录的程序(0文件将返回false).
: w" h3 l" K- Q3 c7 ^
; ]$ x; T; I% y6 {有时候需要知道目录的信息,可以使用dirname($path)和basename($path),分别返回路径的目录部分和文件名名称部分,可用disk_free_space($path)返回看空间空余空间.; ^7 b8 b9 d/ u* O; z2 x% ^

, E" E, C2 b7 y6 T( o创建命令:
  S! M- q3 t( e8 d
  1. mkdir($path,0777)
复制代码
$ I& J. d* u4 e# c! ^( N3 b& f
,0777是权限码,在非window下可用umask()函数设置.
# O% Z# {$ b9 E; J8 M6 c
  1. rmdir($path)
复制代码
; a+ ], F+ `& A+ w! n
将删除路径在$path的文件.
) r3 X9 O  p$ j9 W& }4 A' A, B' N) l. S3 ^
dir -- directory 类也是操作文件目录的重要类,有3个方法,read,rewind,close,这是一个仿面向对象的类,它先使用的是打开文件句柄,然后用指针的方式读取的.,这里看php手册:
& \5 ~# G& s4 ]/ n1 g; V; I
  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. ?>
复制代码
* O9 B0 M4 g& u# h2 g4 D4 A
输出:. T4 f: u# ]+ `0 @4 t1 b* X
  1. Handle: Resource id #2
  2. Path: /etc/php5
  3. .
  4. ..
  5. apache
  6. cgi
  7. cli
复制代码

! u* `; N1 V! j8 H文件的属性也非常重要,文件属性包括创建时间,最后修改时间,所有者,文件组,类型,大小等
# t3 u! O5 e, }- d
) u: K2 j! R' [+ ~. B下面我们重点谈文件操作.
% b+ E/ d% n, d8 c9 j9 c: N  K! M4 ]" Y
三:文件操作
  d" k/ S% i! Q- S& ~1 c! J& X( E: M0 X$ i
●    读文件
- `& Z" ?! w# W4 i, c( ^
- B# K. o6 T$ z+ m7 q' m首先是一个文件看能不能读取(权限问题),或者存在不,我们可以用is_readable函数获取信息.:
$ f# [* f, R4 b/ \! R  _# I3 c" N
  1. <?php
  2. $file = 'dirlist.php';
  3. if (is_readable($file) == false) {
  4.         die('文件不存在或者无法读取');
  5. } else {
  6.         echo '存在';
  7. }
  8. ?>
复制代码

, a& k; j. h. @: `% a
* Q. R) R  z4 u8 L5 {; e判断文件存在的函数还有file_exists(下面演示),但是这个显然无is_readable全面.,当一个文件存在的话可以用% I: k" u3 J1 h0 e. D9 Z, f. Q  t
. ]% J7 U0 q. R  M. N% k
  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. ?>
复制代码

  j  t6 T  Q6 S' D# O但是file_get_contents函数在较低版本上不支持,可以先创建文件的一个句柄,然后用指针读取全部:
7 q, l- [# W/ Z1 I2 k4 j
; q/ K( `5 ^; \# J
  1.         $fso = fopen($cacheFile, 'r');
  2.         $data = fread($fso, filesize($cacheFile));
  3.         fclose($fso);
复制代码
7 d5 D/ v0 m- f( N' T" j
还有一种方式,可以读取二进制的文件:
/ [5 {2 b6 k2 ~. }/ B6 T
  1. $data = implode('', file($file));
复制代码
1 P- K, y( z# y+ b# _/ T8 ~
●   写文件 2 ^0 S4 H  n* ~6 m) X* l  ?$ w
7 ~  W" h8 r4 ]; T1 k6 e
和读取文件的方式一样,先看看是不是能写:& E$ V. X2 P# _, W' }8 w

. M: z0 b+ e- |
  1. <?php

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

! n; l+ Q0 N/ I. R! S( X9 F& [* c! E" X* ]+ T/ n( R- K
能写了的话可以使用file_put_contents函数写入:
" i! c" P- n+ Z$ X$ K4 l! X0 R2 B
  1. <?php
  2. $file = 'dirlist.php';
  3. if (is_writable($file) == false) {
  4.         die('我是鸡毛,我不能');
  5. }
  6. $data = '我是可鄙,我想要';
  7. file_put_contents ($file, $data);
  8. ?>
复制代码

8 i" y; t" ^  ~. t0 nfile_put_contents函数在php5中新引进的函数(不知道存在的话用function_exists函数先判断一下)低版本的php无法使用,可以使用如下方式:
( ^- g# i; k7 q# b. w! Y
% Z7 ~: k6 ~) D; q
  1. $f = fopen($file, 'w');
  2. fwrite($f, $data);
  3. fclose($f);
复制代码
8 c9 C" v* t% D

" `( a3 ?) T$ X8 `替换之.
1 I8 O& Y8 H: E7 r* \+ E/ q' J& Y( c+ E) W
写文件的时候有时候需要锁定,然后写:
' c/ d- O* p; j; J
  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. }
复制代码

# x3 l8 W$ D% T" c: z, W/ T●    复制,删除文件
/ }* o+ X7 _/ x. m. e: R1 }1 u( U. L& Y' D/ T) b3 T
php删除文件非常easy,用unlink函数简单操作:. \6 m8 {3 ]6 T' c

2 n; @8 e+ q/ l7 }- q  \
  1. <?php
  2. $file = 'dirlist.php';
  3. $result = @unlink ($file);
  4. if ($result == false) {
  5.         echo '蚊子赶走了';
  6. } else {
  7.         echo '无法赶走';
  8. }
  9. ?>
复制代码
4 |+ J* d* r; [! N; S9 b
即可.3 ]. D! H+ g8 @7 o
6 z; r& R! _; ]4 Z
复制文件也很容易:
3 m; p" A& I# h/ Z7 v' x5 O3 R7 g) h' J% K
  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. ?>
复制代码

* C. p$ q) a. }! W9 n' q可以使用rename()函数重命名一个文件夹.其他操作都是这几个函数组合一下就能实现的.; I$ I0 _* K4 |5 T
. Q- v: B1 T! [2 K
●   获取文件属性 % ^" B# V  P& d0 [
; u+ v; r2 d: E1 Z# T
我说几个常见的函数:4 \+ D! x) Y3 a/ l% Z; X
获取最近修改时间:# Z& y- x9 l5 W3 @+ \/ N* q+ E9 ~
2 F5 Y( o4 z  H
  1. <?php
  2. $file = 'test.txt';
  3. echo date('r', filemtime($file));
  4. ?>
复制代码
: ^7 |3 _: d5 M# A" g7 g0 X

4 w  c: N0 G; T2 E8 W% j$ p. p返回的说unix的时间戳,这在缓存技术常用.# ]  ]: Y' _# `/ `# r6 i
. J$ k+ z$ O0 n4 I' |
相关的还有获取上次被访问的时间fileatime(),filectime()当文件的权限,所有者,所有组或其它 inode 中的元数据被更新时间,fileowner()函数返回文件所有者 % H. o0 u" L( w( f% _& a0 j
$owner = posix_getpwuid(fileowner($file));
+ m* F1 h! m4 G(非window系统),ileperms()获取文件的权限,5 Y) x7 [9 O' v9 d5 ~: Z
  1. <?php
  2. $file = 'dirlist.php';
  3. $perms = substr(sprintf('%o', fileperms($file)), -4);
  4. echo $perms;
  5. ?>
复制代码

) {/ a' u6 ^' o$ \( Kfilesize()返回文件大小的字节数:
3 i5 I& F6 |0 k# q; k0 y4 E
  1. <?php

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

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

  5. ?>
复制代码
  f2 K$ I% W! g
获取文件的全部信息有个返回数组的函数stat()函数:1 S( c) u: ]6 V7 D  r( R( d
  1. <?php
  2. $file = 'dirlist.php';
  3. $perms = stat($file);
  4. var_dump($perms);
  5. ?>
复制代码
: Y+ }- k4 E! O
那个键对应什么可以查阅详细资料,此处不再展开.
3 [0 a$ N0 N6 L$ Q+ ]& Y+ a; T) c+ O* a3 k, ^7 O; U7 f
四:结束语- `- B3 {4 s! V0 `5 ], |& Y
1 N; [- m( c8 |6 I, B
上面我简要的总结了一下几个文件操作,如果您熟练掌握以上列出的函数,已经在操作的时候没什么大的问题,php文件操作的函数变化比较快,现在已经非常强大了,文件这部分也是学习php非常重要的一部分,希望不要忽略.




欢迎光临 捌玖网络工作室 (http://www.89w.org/) Powered by Discuz! 7.2