返回列表 发帖

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

  一:引论1 X2 R7 G, q3 x& Q' l+ R
9 ~6 U7 b) S( U
  在任何计算机设备中,文件是都是必须的对象,而在web编程中,文件的操作一直是web程序员的头疼的地方,而,文件的操作在cms系统中这是必须的,非常有用的,我们经常遇到生成文件目录,文件(夹)编辑等操作,现在我把php中的这些函数做一详细总结并实例示范如何使用.,关于对应的函数详细介绍,请查阅php手册.此处只总结重点.和需要注意的地方.(这在php手册是没有的.); x* y* `0 ?/ r/ i
- g3 q6 z% o& N( r8 Q" g
  二:目录操作
* c% Y  x( y8 D5 j* s! e( X1 l3 a) w8 X9 Y1 j
  首先介绍的是一个从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,而后迭代列出:
; R/ D" E: T$ g  G
  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. ?>
复制代码

# u9 T2 p* y: u! d; E' h. h, m; F" P这是讲返回文件目录下面的文件已经目录的程序(0文件将返回false).
! l+ k& P4 o6 `* M; m- Y# S
- }# ~  A5 X6 V$ _4 o  U有时候需要知道目录的信息,可以使用dirname($path)和basename($path),分别返回路径的目录部分和文件名名称部分,可用disk_free_space($path)返回看空间空余空间., ?0 v+ ?2 D+ F) b6 p4 B
- [' {9 {: j. h  U. {; S" i5 [
创建命令:: P# n/ q% m- c' b" s- J
  1. mkdir($path,0777)
复制代码

. o# }) q* W. p+ P,0777是权限码,在非window下可用umask()函数设置., F5 N; V& O* w" m
  1. rmdir($path)
复制代码

$ v& {8 V. H. M将删除路径在$path的文件.9 M+ f1 _6 N, f, R0 D

3 a( ~3 _5 b+ w. n  qdir -- directory 类也是操作文件目录的重要类,有3个方法,read,rewind,close,这是一个仿面向对象的类,它先使用的是打开文件句柄,然后用指针的方式读取的.,这里看php手册:
! ~- d) @* V* ], `$ y- n
  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. ?>
复制代码

  y* [5 Q8 w  O& N6 V$ H" }输出:
0 o) x# n+ k  B$ s5 U/ i  X3 M4 S
  1. Handle: Resource id #2
  2. Path: /etc/php5
  3. .
  4. ..
  5. apache
  6. cgi
  7. cli
复制代码

& o$ m0 U! s" D' n: V文件的属性也非常重要,文件属性包括创建时间,最后修改时间,所有者,文件组,类型,大小等
% Q+ i8 W; A5 N. j# ^
; {: T' `% l: X; y# T下面我们重点谈文件操作.
; g3 w3 D# Q* T5 o- U% c8 d; @5 X7 [+ D& Q
三:文件操作
( U1 {6 p" h0 ~3 ]  c3 `" n! Q$ P# V9 t& \
●    读文件
0 @0 m6 {# c# O. j4 d# _0 Y6 p- ~. D
首先是一个文件看能不能读取(权限问题),或者存在不,我们可以用is_readable函数获取信息.: $ j; U8 `( R% E- r
  1. <?php
  2. $file = 'dirlist.php';
  3. if (is_readable($file) == false) {
  4.         die('文件不存在或者无法读取');
  5. } else {
  6.         echo '存在';
  7. }
  8. ?>
复制代码
0 c6 A, N  s, p; f& n
7 \- s( n! c7 c, M/ p8 o
判断文件存在的函数还有file_exists(下面演示),但是这个显然无is_readable全面.,当一个文件存在的话可以用/ a% y) r5 t  f, I: ^4 C' F: @% [

* U0 v8 _0 ~2 ]5 Z2 |
  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. ?>
复制代码
% R; I. ^( U* r9 l
但是file_get_contents函数在较低版本上不支持,可以先创建文件的一个句柄,然后用指针读取全部:
/ Y  _& g3 x8 Q$ [
6 Q7 `$ q) j" \% g5 Z: J
  1.         $fso = fopen($cacheFile, 'r');
  2.         $data = fread($fso, filesize($cacheFile));
  3.         fclose($fso);
复制代码

# N# V' O5 P& z" U  b9 z2 y3 \4 L还有一种方式,可以读取二进制的文件:
7 \/ U! D: h0 J% X# G2 g- z: V
  1. $data = implode('', file($file));
复制代码
9 a7 |0 r( s& e. v6 U
●   写文件
% K/ Y4 R8 D/ U9 x& }/ j# H: p+ p
和读取文件的方式一样,先看看是不是能写:
  H+ T* x0 h; u/ }2 t
5 _6 o; {# i+ r1 a* [8 T
  1. <?php

  2. $file = 'dirlist.php';
  3. if (is_writable($file) == false) {
  4.         die("我是鸡毛,我不能");
  5. }
  6. ?>
复制代码
! X  c1 X$ `0 c3 V
# g7 d1 @) Q/ |2 r' c
能写了的话可以使用file_put_contents函数写入:
3 J& I% {. r/ A! N5 P
  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 o% w4 d7 T! n4 ?1 J9 l& Cfile_put_contents函数在php5中新引进的函数(不知道存在的话用function_exists函数先判断一下)低版本的php无法使用,可以使用如下方式:
. S3 y: U( L: _  ~* p9 b) B4 P) }! ^. D1 _* P# ~' p0 Q
  1. $f = fopen($file, 'w');
  2. fwrite($f, $data);
  3. fclose($f);
复制代码

  k$ Y* s! O, K  i7 ~, Q7 C& E  h  `& ]! N
替换之.
3 G8 O" k& `% e8 _; D& `; S( B% l5 W, p1 E
写文件的时候有时候需要锁定,然后写:; V$ R) `( y- X7 ]
  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. }
复制代码

! j7 g8 ~$ k7 ]. i) l& l6 V" O) a  Y●    复制,删除文件 # f, M) x4 W' w+ I# d, O2 J4 P. Z
" ?1 g% n  [$ U2 `" ^- j% _7 _
php删除文件非常easy,用unlink函数简单操作:
1 Y0 }4 }5 p/ ~( A9 X! \8 s! F
4 U4 d5 b2 h: c2 g2 m, u
  1. <?php
  2. $file = 'dirlist.php';
  3. $result = @unlink ($file);
  4. if ($result == false) {
  5.         echo '蚊子赶走了';
  6. } else {
  7.         echo '无法赶走';
  8. }
  9. ?>
复制代码

2 H# O$ g% J# R& X$ D即可.
- k5 t2 m& ?  s2 j& o
8 W- K5 D0 d# g) p: t复制文件也很容易:
1 d0 d0 o2 Y3 s; G% Z
7 Z1 I. I* O+ n# K% ?* f
  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. ?>
复制代码
  ]- W$ t: F+ D1 a7 m& |
可以使用rename()函数重命名一个文件夹.其他操作都是这几个函数组合一下就能实现的.( L: [+ X' ?- W% e# S+ J4 h2 E
4 {' J( b4 }+ m# w4 ]5 D6 V
●   获取文件属性 - P! V) C! F( V: f1 k( c
+ I5 l& @. ~/ g, F4 ?$ Y) Q
我说几个常见的函数:
4 ^$ \$ P2 @% N& H) N获取最近修改时间:# e' j2 p1 c* I; T. g2 \' w

0 d% U% _4 f1 `- {" @
  1. <?php
  2. $file = 'test.txt';
  3. echo date('r', filemtime($file));
  4. ?>
复制代码

$ W9 t! y: `0 b  Q6 K
2 r3 e) U( |; T/ V# J8 Z; \返回的说unix的时间戳,这在缓存技术常用.* K2 u/ s) U: L4 D8 C; I: Y
, x  w3 a4 c' _. n( }! j# x7 E$ G
相关的还有获取上次被访问的时间fileatime(),filectime()当文件的权限,所有者,所有组或其它 inode 中的元数据被更新时间,fileowner()函数返回文件所有者
. o5 C& j5 b' z* Z5 {$owner = posix_getpwuid(fileowner($file));
2 ]9 m1 Y6 z( R: ](非window系统),ileperms()获取文件的权限,; [0 ?, k8 u- R+ }
  1. <?php
  2. $file = 'dirlist.php';
  3. $perms = substr(sprintf('%o', fileperms($file)), -4);
  4. echo $perms;
  5. ?>
复制代码
( [7 e7 [4 V' L2 w5 ~
filesize()返回文件大小的字节数:
9 g- J( @6 I0 t
  1. <?php

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

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

  5. ?>
复制代码

& c  o$ p1 ?% }) I获取文件的全部信息有个返回数组的函数stat()函数:3 e# ^0 w7 r1 x" o
  1. <?php
  2. $file = 'dirlist.php';
  3. $perms = stat($file);
  4. var_dump($perms);
  5. ?>
复制代码
2 I6 Y) m2 n5 t9 H0 G
那个键对应什么可以查阅详细资料,此处不再展开.
' T% D( j/ N1 o) m  p2 o
/ |. ~4 V9 ~4 O& A2 L( L  d' B! C四:结束语$ N' a8 i8 ~/ ?; c9 m$ F/ V$ x, u
1 |9 l6 j7 y4 h, Q% t
上面我简要的总结了一下几个文件操作,如果您熟练掌握以上列出的函数,已经在操作的时候没什么大的问题,php文件操作的函数变化比较快,现在已经非常强大了,文件这部分也是学习php非常重要的一部分,希望不要忽略.

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