前面的话
在程序运行时,程序本身和数据一般都存在内存中,当程序运行结束后,存放在内存中的数据被释放。如果需要长期保存程序运行所需的原始数据,或程序运行产生的结果,就需要把数据存储在文件或数据库。一般地,小型数据存储在文件中,海量数据存储在数据库中。本文主要介绍php中目录和文件的基本操作
文件类型
文件一般指存储在外部介质上具有名字(文件名)的一组相关数据集合。用文件可长期保存数据,并实现数据共享
PHP是以UNIX的文件系统为模型的。因此在Windows系统中我们只能获得”file”、”dir”或者“unknown”三种文件类型。而在UNIX系统中,我们可以获得block、char、dir、fifo、file、link和unknown七种类型
可以使用函数filetype()获取文件的具体类型,可能的值有fifo,char,dir,block,link,file 和 unknown
string filetype ( string filename )
如果出错则返回 FALSE。如果调用失败或者文件类型未知的话 filetype() 还会产生一个 E_NOTICE 消息
在服务器中新建一个目录test,并在目录中新建一个文件a.txt
在这7种文件类型中,window系统常用的是'file'和'dir'这两种,它们配套的类型检测函数分别是is_dir( )和is_file( )
is_dir( )
判断给定文件名是否是一个目录。如果文件名存在并且是一个目录则返回 true,否则返回 false
bool is_dir(_name)
is_file( )
判断给定文件名是否为一个正常的文件,如果文件存在且为正常的文件则返回 true
bool is_file(_name)
文件属性
一般地,在文件或目录右键菜单中,选择属性,即可查看文件的属性
下表中列出了php中关于文件属性的常用函数
目录路径
windows下的目录路径使用是正斜杠(\),而unix下的目录路径使用是反斜杠(/)
$unixPath="/var/www/html/index.php"; //在UNIX系统中的绝对路径,必须使用"/"分隔$winPath="C:\\Appserv\\www\\index.php"; //在Windows系统的绝对路径,默认使用"\"分隔$winPath2="C:/Appserv/www/index.php"; //在Windows系统中也可使用“/”分隔
因为在Windows系统中也可使用(/)分隔。所以,在PHP中,不论是什么操作系统,全部都使用反斜杠(/)代表路径分隔符号
在PHP中,还提供了一个常量DIRECTORY_SEPARATOR,以此来代表目录分隔符,但写起来较麻烦
在windows下多个路径的分隔符使用分号(;)分隔,而unix下使用冒号(:)分隔
在PHP中,提供了一个常量PATH_SEPARATOR,用来在跨平台的情况下,表示多个路径之间的分隔符
换行
在window下,换行是\r\n,而在unix下,换行是\n。通常在写程序中,换行就以unix为准,写作\n
同样地,PHP提供了一个常量PHP_EOL,用来在跨平台的情况下,表示换行
.和..
在PHP中,.表示当前目录,..表示上一级目录
根路径
有两种根路径需要进行区分,一种是客户端根路径,一种是服务器根路径
以我自己在d盘安装的wamp为例,客户端根路径指'd:\wamp\www\',而服务器根路径为为'd:\'
';//客户端根路径,相当于d:\wamp\www\a.jpgmkdir('/hello');//服务器根路径,相当于d:\hello?>
路径解析函数
【basename()】
basename()函数用于返回路径中的文件名部分
【dirname()】
dirname()函数用于返回路径中的目录部分
【pathinfo()】
pathinfo()函数用于返回文件路径的信息
【realpath()】
realpath()函数用于返回规范化的绝对路径名
在Windows上,realpath()会将unix风格的路径改成Windows风格的
目录遍历
glob()
glob()函数用于寻找与模式匹配的文件路径
array glob ( string $pattern [, int $flags = 0 ] )
在www目录下新建a.txt和b.txt文件
opendir()
opendir()函数用于打开目录句柄。如果成功则返回目录句柄的resource,失败则返回 FALSE
resource opendir ( string $path [, resource $context ] )
closedir()
closedir()函数用于关闭目录句柄
void closedir ([ resource $dir_handle ] )
参数dir_handle表示目录句柄的 resource,之前由 opendir()所打开的。如果目录句柄没有指定,那么会假定为是opendir()所打开的最后一个句柄
readdir()
readdir()函数用于从目录句柄中读取条目,返回目录中下一个文件的文件名。文件名以在文件系统中的排序返回,失败时返回 FALSE
string readdir ([ resource $dir_handle ] )
在www目录下新建目录test,并在目录test下新建a.txt和b.txt文件
";//.echo readdir($dir)."";//..echo readdir($dir)."";//a.txtecho readdir($dir)."";//b.txtecho readdir($dir)."";//closedir($dir);?>
在遍历目录时,每个目录的前两个返回值都是.和..,.代表当前目录,..代表上一级目录
所以,一般地,列出当前目录的所有文件并去掉 . 和 ..,常采用下面的代码
接下来,在test目录下,新建一个目录in,并在in目录中新建文件c.txt。然后,目录和文件区分显示
[注意]通过is_dir()函数判断目录时,需要加入路径
"; }else{ echo "文件:".$file.""; } } } closedir($handle);}/*文件:test/a.txt文件:test/b.txt目录:test/in */?>
rewinddir()
rewinddir()函数用于倒回目录句柄,将参数dir_handle指定的目录流重置到目录的开头
void rewinddir ( resource $dir_handle )
如果不使用rewinddir()函数,则文件只能遍历一次
"; }else{ echo "文件:".$file.""; } } } while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { $file = "test/".$file; if(is_dir($file)){ echo "目录:".$file.""; }else{ echo "文件:".$file.""; } } } closedir($handle);}/*文件:test/a.txt文件:test/b.txt目录:test/in */?>
使用rewinddir()函数,可以把目录句柄返回到第一个文件,从而实现重新遍历
"; }else{ echo "文件:".$file.""; } } } rewinddir($handle); while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { $file = "test/".$file; if(is_dir($file)){ echo "目录:".$file.""; }else{ echo "文件:".$file.""; } } } closedir($handle);}/*文件:test/a.txt文件:test/b.txt目录:test/in文件:test/a.txt文件:test/b.txt目录:test/in */?>
目录统计
disk_total_space()
disk_total_space()函数返回一个目录的磁盘总大小
float disk_total_space ( string $directory )
";//126652637184$ds = disk_total_space("D:");echo $ds;//1000202240000?>
disk_free_space()
disk_free_space()函数返回目录中的可用空间
float disk_free_space ( string $directory )
";//86087041024$ds = disk_free_space("D:");echo $ds;//481647472640?>
下面来统计在www文件夹下新建的test目录的个数
";//目录数为:1 echo "文件数为:{$filen}";//文件数为:3?>
下面来统计在www文件夹下新建的test目录的大小
";//test目录大小为:302?>
目录增删
mkdir()
mkdir()函数用于新建目录
bool mkdir ( string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context ]]] )
rmdir()
rmdir()函数用于删除目录
bool rmdir ( string $dirname [, resource $context ] )
[注意]该目录必须是空的,而且要有相应的权限。失败时会产生一个 E_WARNING 级别的错误
unlink()
unlink()函数用于删除文件
bool unlink ( string $filename [, resource $context ] )
下面来清空test目录
目录复制
copy()
copy()函数用于拷贝文件
bool copy ( string $source , string $dest [, resource $context ] )
[注意]copy()函数不能用于复制目录
rename()
rename()函数用于重命名一个文件或目录
bool rename ( string $oldname , string $newname [, resource $context ] )
[注意]rename()函数具有移动文件或目录的功能
下面把www目录下的test目录剪贴,命名为t,并移动到d盘目录下
使用rename()只能实现剪切的操作,使用copy()只能复制文件。如果要复制目录,则需要使用循环和遍历
文件操作
touch()
touch()函数用来设定文件的访问和修改时间。如果文件不存在,则会被创建。成功时返回 TRUE, 或者在失败时返回 FALSE
bool touch ( string $filename [, int $time = time() [, int $atime ]] )
参数filename表示要设定的文件名,time表示要设定的时间。如果没有提供参数 time 则会使用当前系统的时间;atime表示如果给出了这个参数,则给定文件的访问时间会被设为atime,否则会设置为time。如果没有给出这两个参数,则使用当前系统时间
copy()
copy()函数用于拷贝文件
bool copy ( string $source , string $dest [, resource $context ] )
[注意]copy()函数不能用于复制目录
rename()
rename()函数用于重命名一个文件或目录
bool rename ( string $oldname , string $newname [, resource $context ] )
[注意]rename()函数具有移动文件或目录的功能
unlink()
unlink()函数用于删除文件
bool unlink ( string $filename [, resource $context ] )
文件内容
fopen()
fopen()函数用于打开文件或者URL,fopen()将 filename 指定的名字资源绑定到一个流上
fopen() 中 mode 的可能值列表
mode 说明'r' 只读方式打开,将文件指针指向文件头。'r+' 读写方式打开,将文件指针指向文件头。'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。'w+' 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。'a' 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。'a+' 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
fclose()
fclose()函数用于关闭一个已打开的文件指针
bool fclose ( resource $handle )
fwrite()
fwrite()函数用于写入文件(可安全用于二进制文件),返回写入的字符数,出现错误时则返回 FALSE
int fwrite ( resource $handle , string $string [, int $length ] )
当打开方式为只读模式时,无法向文件写入字符
";echo fwrite($fp, '23');//0echo "";fclose($fp);?>
当打开方式为写模式时,可以向文件写入字符
";echo fwrite($fp, '23');//2echo "";fclose($fp);/*文件内容为123 */?>
当打开方式为追加模式时,将向文件的尾部追加新的字符
";echo fwrite($fp, '23');//2echo "";fclose($fp);/*刷新两次时,文件内容为123123 */?>
fgetc()
fgetc()函数用于从文件指针中读取字符
[注意]使用fgetc()函数时,需要在fopen()函数中使用读模式
string fgetc ( resource $handle )
feof()
feof()函数用于测试文件指针是否到了文件结束的位置
bool feof ( resource $handle )
fgets()
fgets()函数用于从文件指针中读取一行
string fgets ( resource $handle [, int $length ] )
将test目录下的a.txt文件内容修改为
aabbb
fread()
fread()函数用于读取文件(可安全用于二进制文件)。fread()从文件指针handle读取最多length个字节。该函数在读取了length个字节或到达了文件末尾(EOF)时将停止读取文件
string fread ( resource $handle , int $length )
fseek()
fseek()函数用于在文件指针中定位,成功则返回 0;否则返回 -1
int fseek ( resource $handle , int $offset [, int $whence = SEEK_SET ] )
将test目录下的a.txt文件内容修改为'12345'
";//12fseek($fp,4);echo fread($fp,2)."";//5fseek($fp,-3,SEEK_END);echo fread($fp,2)."";//34fclose($fp);?>
ftell()
ftell()函数用于返回文件指针读/写的位置
int ftell ( resource $handle )
rewind()
rewind()函数用于倒回文件指针的位置,将handle的文件位置指针设为文件流的开头
bool rewind ( resource $handle )
file_get_contents()
file_get_contents()函数用于将整个文件读入一个字符串
string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] )
页面变为百度首页
file_put_contents()
file_put_contents()函数用于将一个字符串写入文件
int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )
使用该函数和依次调用 fopen(),fwrite() 以及 fclose() 功能一样
[注意]默认为写模式,若设置第三个参数为FILE_APPEND,则变为追加模式
readfile()
readfile()函数用于读取文件并写入到输出缓冲
int readfile ( string $filename [, bool $use_include_path = false [, resource $context ]] )
file()
file()函数用于把整个文件读入一个数组中,每一行作为一个数组的元素
array file ( string $filename [, int $flags = 0 [, resource $context ]] )
将a.txt的文件内容改为每一行一个数字,分别是1、2、3、4、5、6、7、8、9
";//1echo count($arr);//9?>
ftruncate()
ftruncate()函数用于将文件截断到给定的长度
bool ftruncate ( resource $handle , int $size )
[注意]使用ftruncate()函数时,需要使用追加模式。经测试,使用读模式时无效,使用写模式时,文件内容被清空