获得本站免费赞助空间请点这里
返回列表 发帖

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

  一:引论6 h: S1 ]7 J: N1 |

  B5 d8 }: y' `' w4 l4 C: h  在任何计算机设备中,文件是都是必须的对象,而在web编程中,文件的操作一直是web程序员的头疼的地方,而,文件的操作在cms系统中这是必须的,非常有用的,我们经常遇到生成文件目录,文件(夹)编辑等操作,现在我把php中的这些函数做一详细总结并实例示范如何使用.,关于对应的函数详细介绍,请查阅php手册.此处只总结重点.和需要注意的地方.(这在php手册是没有的.)
1 J. t$ C" c* X& ^
$ l9 z; d# ?; f' ~, o9 k3 C8 L, B  二:目录操作+ h* m+ q, g) {4 f
* X6 I5 |* G8 L; K( p: c1 n8 p8 }2 b* t
  首先介绍的是一个从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,而后迭代列出:
6 U7 J& _$ t1 h) c$ D
  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. ?>
复制代码

/ n: r- c% s+ Z. v7 D% f4 r这是讲返回文件目录下面的文件已经目录的程序(0文件将返回false).1 n6 A. r' I6 E; G5 p: e
2 K, H  f' E4 L5 _
有时候需要知道目录的信息,可以使用dirname($path)和basename($path),分别返回路径的目录部分和文件名名称部分,可用disk_free_space($path)返回看空间空余空间.
$ M: f1 ]+ J2 ~; }. ~; H* v9 M: B( z) r) j) l- {# B7 U
创建命令:* _/ ^# }3 M. s3 O4 {
  1. mkdir($path,0777)
复制代码
; @& y, h& Z, C  }4 ^* T' Z" r6 M
,0777是权限码,在非window下可用umask()函数设置.: o" m+ y' k  _# S7 g4 x' W7 W" |
  1. rmdir($path)
复制代码

5 N9 U. u& {; l- U( e+ n: l将删除路径在$path的文件.0 A! e; X; Z- U- H

# c% A9 ^0 D: e! ~3 ^+ l, r5 Mdir -- directory 类也是操作文件目录的重要类,有3个方法,read,rewind,close,这是一个仿面向对象的类,它先使用的是打开文件句柄,然后用指针的方式读取的.,这里看php手册:6 \& K) i. h2 g! P- K
  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. ?>
复制代码
; X8 j  Z( w( L! d4 g/ d7 ]7 {
输出:
% ]+ ~/ o  e0 q, ~0 J# b- H( z
  1. Handle: Resource id #2
  2. Path: /etc/php5
  3. .
  4. ..
  5. apache
  6. cgi
  7. cli
复制代码
: x4 H( m" `6 x' n& t
文件的属性也非常重要,文件属性包括创建时间,最后修改时间,所有者,文件组,类型,大小等
' p; w; t1 ?. f8 e% C  V' j- |& T1 e" p0 _5 U9 y" h% E- W
下面我们重点谈文件操作.
% l$ b- p* q) k; J, I
8 ?8 @& F+ N& \5 s3 r4 }$ K+ S. A三:文件操作
8 q) g( n& c, K# A. L6 ^3 x2 w; X5 {
/ L) |! b6 F; ]5 p% ?●    读文件   Z% f+ Y- _% x5 f

( z9 S7 k! Z9 [4 m首先是一个文件看能不能读取(权限问题),或者存在不,我们可以用is_readable函数获取信息.: 5 s4 `6 [) _; f
  1. <?php
  2. $file = 'dirlist.php';
  3. if (is_readable($file) == false) {
  4.         die('文件不存在或者无法读取');
  5. } else {
  6.         echo '存在';
  7. }
  8. ?>
复制代码

% Y1 `# E7 P. ?/ E5 H: a
9 `  ]1 M- y3 T' m, [! A6 s0 n$ u判断文件存在的函数还有file_exists(下面演示),但是这个显然无is_readable全面.,当一个文件存在的话可以用) V' @* t/ m7 z8 i5 q
5 b' P% W; m5 ?; B. u
  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. ?>
复制代码

7 H& e5 Y% M, f7 b% N. t  [0 g8 L1 C但是file_get_contents函数在较低版本上不支持,可以先创建文件的一个句柄,然后用指针读取全部:
4 K  Z# h" J9 _% v# _% ]
0 ^! j7 t* j4 E) Y( l
  1.         $fso = fopen($cacheFile, 'r');
  2.         $data = fread($fso, filesize($cacheFile));
  3.         fclose($fso);
复制代码

% p  |9 R& t; ~$ D  g还有一种方式,可以读取二进制的文件:" S$ W+ ^0 m1 H6 d3 m  Z+ v/ ^* u4 H
  1. $data = implode('', file($file));
复制代码

9 c* V! g: C# `% i  _●   写文件
1 }5 K- n0 m) i: e) Z8 W. H
. r2 M# t# y+ [% f( `  t和读取文件的方式一样,先看看是不是能写:
, J' j7 y, \! r, }; s) i0 _2 X& I3 q% `7 m! |/ p" A3 C$ Y/ b  _
  1. <?php

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

8 D( g3 s- N) E+ ~' T1 W* W能写了的话可以使用file_put_contents函数写入:4 F) ]  o1 K" y$ u8 O2 j
  1. <?php
  2. $file = 'dirlist.php';
  3. if (is_writable($file) == false) {
  4.         die('我是鸡毛,我不能');
  5. }
  6. $data = '我是可鄙,我想要';
  7. file_put_contents ($file, $data);
  8. ?>
复制代码
0 v# a" X* R2 x4 K0 }4 r
file_put_contents函数在php5中新引进的函数(不知道存在的话用function_exists函数先判断一下)低版本的php无法使用,可以使用如下方式:
' R  F5 \9 Q0 U% k+ N  c1 _5 [' B, F8 w, B( m0 Q7 J
  1. $f = fopen($file, 'w');
  2. fwrite($f, $data);
  3. fclose($f);
复制代码

; `2 J+ \# ?* ~) K5 G5 y9 t0 e9 _: E* @7 G2 w. S
替换之.7 r- S- y! h4 A; ]$ ^% y) H

. ~% n7 E: y- Q# D) H8 W写文件的时候有时候需要锁定,然后写:
- B4 w2 V2 R- I* Z) _
  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 U+ I9 |) ?. ]2 c4 g+ c  A1 y
●    复制,删除文件 # q: R: @0 W" ^) \

: Y% x: @0 ?. \7 `' k4 bphp删除文件非常easy,用unlink函数简单操作:
4 A# b; I+ g6 v
5 V; K; w, _! c( M* p. q
  1. <?php
  2. $file = 'dirlist.php';
  3. $result = @unlink ($file);
  4. if ($result == false) {
  5.         echo '蚊子赶走了';
  6. } else {
  7.         echo '无法赶走';
  8. }
  9. ?>
复制代码

: T/ X; \- ^$ i+ c0 e, N即可.: g- H+ C/ K: ?0 I; {
+ `  U* c: u: D0 Y, ~
复制文件也很容易:7 X0 F9 Z5 A+ x+ l
# H  w6 c0 g/ H2 Q) |' n2 @
  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. ?>
复制代码

+ \5 [1 U$ F7 }/ J2 @3 |* T可以使用rename()函数重命名一个文件夹.其他操作都是这几个函数组合一下就能实现的.
; ]4 A" T1 r9 W/ R4 @+ i8 [9 k: J# i0 d* h: ^: I
●   获取文件属性
6 M( d5 ]8 a0 N+ j
# h. g: X& L' T# B我说几个常见的函数:
  A( I# W6 k# p8 n' a: L获取最近修改时间:6 a/ L, G- ^0 d4 z6 J* X7 C
8 \  x" Z3 W; T5 o  R7 j
  1. <?php
  2. $file = 'test.txt';
  3. echo date('r', filemtime($file));
  4. ?>
复制代码
% _6 U  X- S( \4 [) k
: z+ h" N0 ]# L& j! ^! R2 x6 |, P
返回的说unix的时间戳,这在缓存技术常用.( E# ]0 K: u, A) d' B/ [0 x
' G. L( U/ d& }5 n; E% d9 _
相关的还有获取上次被访问的时间fileatime(),filectime()当文件的权限,所有者,所有组或其它 inode 中的元数据被更新时间,fileowner()函数返回文件所有者
9 W( ]7 t2 a$ t4 q' O' E, u$owner = posix_getpwuid(fileowner($file));
& R& @5 ^4 a6 k4 F$ e4 B(非window系统),ileperms()获取文件的权限,' ^; D3 H8 c+ w
  1. <?php
  2. $file = 'dirlist.php';
  3. $perms = substr(sprintf('%o', fileperms($file)), -4);
  4. echo $perms;
  5. ?>
复制代码
! b. k% u6 s5 [& @
filesize()返回文件大小的字节数:
# k. @& G+ Z% s) y. R! z
  1. <?php

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

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

  5. ?>
复制代码

% A3 I/ x8 ~) A* |获取文件的全部信息有个返回数组的函数stat()函数:" Y0 s! Z3 T6 o$ y& _5 j0 ~# {0 u( h
  1. <?php
  2. $file = 'dirlist.php';
  3. $perms = stat($file);
  4. var_dump($perms);
  5. ?>
复制代码

! L& C$ M; }  Z3 ^+ ^+ F9 Q那个键对应什么可以查阅详细资料,此处不再展开.
, h; D; I+ h/ ?4 R4 y6 S% Y1 o+ U$ R! r3 u
四:结束语
' g# r; K2 w+ W, x1 T# V& |. V6 G& i1 d# N8 i3 V
上面我简要的总结了一下几个文件操作,如果您熟练掌握以上列出的函数,已经在操作的时候没什么大的问题,php文件操作的函数变化比较快,现在已经非常强大了,文件这部分也是学习php非常重要的一部分,希望不要忽略.

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