|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14433
- 金币
- 2502
- 威望
- 1647
- 贡献
- 1450
|
一:引论( 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- <?php
- $base_dir = "filelist/";
- $fso = opendir($base_dir);
- echo $base_dir."<hr/>" ;
- while($flist=readdir($fso)){
- echo $flist."<br/>" ;
- }
- closedir($fso)
- ?>
复制代码
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
0 o6 Y7 u6 e, X6 |3 E* X0 V; R
,0777是权限码,在非window下可用umask()函数设置.7 R. g( p8 H$ N8 }
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
- <?php
- $d = dir("/etc/php5");
- echo "Handle: " . $d->handle . "\n";
- echo "Path: " . $d->path . "\n";
- while (false !== ($entry = $d->read())) {
- echo $entry."\n";
- }
- $d->close();
- ?>
复制代码 7 S+ m) `+ i6 w z( d6 c
输出:4 B! ^4 L8 y2 p/ b# y4 L+ j: x! L
- Handle: Resource id #2
- Path: /etc/php5
- .
- ..
- apache
- cgi
- 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
- <?php
- $file = 'dirlist.php';
- if (is_readable($file) == false) {
- die('文件不存在或者无法读取');
- } else {
- echo '存在';
- }
- ?>
复制代码
) 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
- <?php
- $file = "filelist.php";
- if (file_exists($file) == false) {
- die('文件不存在');
- }
- $data = file_get_contents($file);
- echo htmlentities($data);
- ?>
复制代码
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- $fso = fopen($cacheFile, 'r');
- $data = fread($fso, filesize($cacheFile));
- fclose($fso);
复制代码 ; V4 c# }" U8 T
还有一种方式,可以读取二进制的文件:
- v- f" K9 P$ W- $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 ~
- <?php
- $file = 'dirlist.php';
- if (is_writable($file) == false) {
- die("我是鸡毛,我不能");
- }
- ?>
复制代码
% d: Q- T: n5 s& A ~. r C3 V# ?9 Q& l2 v( _3 \
能写了的话可以使用file_put_contents函数写入:. P. y* X) f5 _1 q
- <?php
- $file = 'dirlist.php';
- if (is_writable($file) == false) {
- die('我是鸡毛,我不能');
- }
- $data = '我是可鄙,我想要';
- file_put_contents ($file, $data);
- ?>
复制代码 . 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
- $f = fopen($file, 'w');
- fwrite($f, $data);
- 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- function cache_page($pageurl,$pagedata){
- if(!$fso=fopen($pageurl,'w')){
- $this->warns('无法打开缓存文件.');//trigger_error
- return false;
- }
- if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定
- $this->warns('无法锁定缓存文件.');//trigger_error
- return false;
- }
- if(!fwrite($fso,$pagedata)){//写入字节流,serialize写入其他格式
- $this->warns('无法写入缓存文件.');//trigger_error
- return false;
- }
- flock($fso,LOCK_UN);//释放锁定
- fclose($fso);
- return true;
- }
复制代码
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 |
- <?php
- $file = 'dirlist.php';
- $result = @unlink ($file);
- if ($result == false) {
- echo '蚊子赶走了';
- } else {
- echo '无法赶走';
- }
- ?>
复制代码 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
- <?php
- $file = 'yang.txt';
- $newfile = 'ji.txt'; # 这个文件父文件夹必须能写
- if (file_exists($file) == false) {
- die ('小样没上线,无法复制');
- }
- $result = copy($file, $newfile);
- if ($result == false) {
- echo '复制记忆ok';
- }
- ?>
复制代码 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
- <?php
- $file = 'test.txt';
- echo date('r', filemtime($file));
- ?>
复制代码 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- <?php
- $file = 'dirlist.php';
- $perms = substr(sprintf('%o', fileperms($file)), -4);
- echo $perms;
- ?>
复制代码
# Q: e+ p1 K% q( r, J( ffilesize()返回文件大小的字节数:) H) b& U; H$ B
- <?php
- // 输出类似:somefile.txt: 1024 bytes
- $filename = 'somefile.txt';
- echo $filename . ': ' . filesize($filename) . ' bytes';
- ?>
复制代码
2 u( o# d! \$ w6 P E6 N获取文件的全部信息有个返回数组的函数stat()函数:8 X. L, l) R% s4 y
- <?php
- $file = 'dirlist.php';
- $perms = stat($file);
- var_dump($perms);
- ?>
复制代码
( 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非常重要的一部分,希望不要忽略. |
|