在程序運行時,程序本身和數據一般都存在內存中,當程序運行結束后,存放在內存中的數據被釋放。如果需要長期保存程序運行所需的原始數據,或程序運行產生的結果,就需要把數據存儲在文件或數據庫。一般地,小型數據存儲在文件中,海量數據存儲在數據庫中。本文主要介紹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
<?phpecho filetype('test/a.txt'); // fileecho filetype('test/'); // direcho filetype('test/b.txt'); // Warning: filetype(): Lstat failed for test/b.txt?>
在這7種文件類型中,window系統常用的是'file'和'dir'這兩種,它們配套的類型檢測函數分別是is_dir( )和is_file( )
is_dir( )
判斷給定文件名是否是一個目錄。如果文件名存在并且是一個目錄則返回 true,否則返回 false
bool is_dir(_name)
is_file( )
判斷給定文件名是否為一個正常的文件,如果文件存在且為正常的文件則返回 true
bool is_file(_name)
<?phpvar_dump (is_file('test/a.txt')); //boolean truevar_dump (is_dir('test/')); //boolean true?>
一般地,在文件或目錄html' target='_blank'>右鍵菜單中,選擇屬性,即可查看文件的屬性
下表中列出了php中關于文件屬性的常用函數
<?phpvar_dump (file_exists('test/a.txt')); //boolean truevar_dump (filesize('test/a.txt')); // int 0 var_dump (is_readable('test/a.txt')); //boolean truevar_dump (is_writeable('test/a.txt')); //boolean truevar_dump (is_executable('test/a.txt')); //boolean falsevar_dump (date('Y-m-d H:i:s',(filectime('test/a.txt'))));//string '2016-11-22 06:47:54' (length=19)var_dump (date('Y-m-d H:i:s',(filemtime('test/a.txt'))));//string '2016-11-22 06:47:54' (length=19)var_dump (date('Y-m-d H:i:s',(fileatime('test/a.txt'))));//string '2016-11-22 06:47:54' (length=19)?>
windows下的目錄路徑使用是正斜杠(),而unix下的目錄路徑使用是反斜杠(/)
$unixPath='/var/www/html/index.php'; //在UNIX系統中的絕對路徑,必須使用'/'分隔$winPath='C:/Appserv/www/index.php'; //在Windows系統的絕對路徑,默認使用''分隔$winPath4='C:/Appserv/www/index.php'; //在Windows系統中也可使用“/”分隔
因為在Windows系統中也可使用(/)分隔。所以,在PHP中,不論是什么操作系統,全部都使用反斜杠(/)代表路徑分隔符號
在PHP中,還提供了一個常量DIRECTORY_SEPARATOR,以此來代表目錄分隔符,但寫起來較麻煩
<?phpecho 'c:'.DIRECTORY_SEPARATOR.'a'.DIRECTORY_SEPARATOR.'b'.DIRECTORY_SEPARATOR.'c'; //c:ac?>
在windows下多個路徑的分隔符使用分號(;)分隔,而unix下使用冒號(:)分隔
在PHP中,提供了一個常量PATH_SEPARATOR,用來在跨平臺的情況下,表示多個路徑之間的分隔符
<?phpecho 'aaa/ccc/ddd'.PATH_SEPARATOR.'/www/yyyy';//aaa/ccc/ddd;/www/yyyy?>
換行
在window下,換行是 ,而在unix下,換行是 。通常在寫程序中,換行就以unix為準,寫作
同樣地,PHP提供了一個常量PHP_EOL,用來在跨平臺的情況下,表示換行
.和..
在PHP中,.表示當前目錄,..表示上一級目錄
<?phpvar_dump (file_exists('test/a.txt'));//boolean truevar_dump (file_exists('./test/a.txt'));//boolean truevar_dump (file_exists('../www/test/a.txt'));//boolean true?>
根路徑
有兩種根路徑需要進行區分,一種是客戶端根路徑,一種是服務器根路徑
以我自己在d盤安裝的wamp為例,客戶端根路徑指'd:wampwww',而服務器根路徑為為'd:'
<?phpecho '<img src='/a.jpg'>';//客戶端根路徑,相當于d:wampwwwa.jpgmkdir('/hello');//服務器根路徑,相當于d:hello?>
路徑解析函數
【basename()】
basename()函數用于返回路徑中的文件名部分
<?phpecho '1) '.basename('/etc/sudoers.d', '.d');//1) sudoersecho '2) '.basename('/etc/passwd').PHP_EOL;//2) passwdecho '3) '.basename('/etc/').PHP_EOL;//3) etcecho '4) '.basename('.').PHP_EOL;//4) .echo '5) '.basename('/');//5) ?>
【dirname()】
dirname()函數用于返回路徑中的目錄部分
<?phpecho '1) ' . dirname('/etc/passwd') . PHP_EOL; // 1) /etcecho '2) ' . dirname('/etc/') . PHP_EOL; // 2) echo '3) ' . dirname('.'); // 3) .?>
【pathinfo()】
pathinfo()函數用于返回文件路徑的信息
<?php$path_parts = pathinfo('/www/htdocs/inc/lib.inc.php');echo $path_parts['dirname'], '';// '/www/htdocs/inc' 目錄名echo $path_parts['basename'], '';// 'lib.inc.php' 文件名echo $path_parts['extension'], '';// 'php' 文件后綴echo $path_parts['filename'], ''; // 'lib.inc' 文件名不帶后綴?>
【realpath()】
realpath()函數用于返回規范化的絕對路徑名
在Windows上,realpath()會將unix風格的路徑改成Windows風格的
<?phpecho realpath('/wamp');// 'D:wamp'?>
glob()
glob()函數用于尋找與模式匹配的文件路徑
array glob ( string $pattern [, int $flags = 0 ] )
在www目錄下新建a.txt和b.txt文件
<?phpforeach (glob('*.txt') as $filename) { //a.txt size 1050 b.txt size 73 echo '$filename size ' . filesize($filename) . '';}?>
opendir()
opendir()函數用于打開目錄句柄。如果成功則返回目錄句柄的resource,失敗則返回 FALSE
resource opendir ( string $path [, resource $context ] )
<?phpvar_dump(opendir('test'))//resource(3, stream)?>
closedir()
closedir()函數用于關閉目錄句柄
void closedir ([ resource $dir_handle ] )
參數dir_handle表示目錄句柄的 resource,之前由 opendir()所打開的。如果目錄句柄沒有指定,那么會假定為是opendir()所打開的最后一個句柄
<?php$dir = opendir('test');closedir($dir);?>
readdir()
readdir()函數用于從目錄句柄中讀取條目,返回目錄中下一個文件的文件名。文件名以在文件系統中的排序返回,失敗時返回 FALSE
string readdir ([ resource $dir_handle ] )
在www目錄下新建目錄test,并在目錄test下新建a.txt和b.txt文件
<?php$dir = opendir('test');echo readdir($dir).'<br>';//.echo readdir($dir).'<br>';//..echo readdir($dir).'<br>';//a.txtecho readdir($dir).'<br>';//b.txtecho readdir($dir).'<br>';//closedir($dir);?>
在遍歷目錄時,每個目錄的前兩個返回值都是.和..,.代表當前目錄,..代表上一級目錄
所以,一般地,列出當前目錄的所有文件并去掉 . 和 ..,常采用下面的代碼
<?phpif ($handle = opendir('test')) { while (false !== ($file = readdir($handle))) { if ($file != '.' && $file != '..') { echo '$file'; } } closedir($handle);}?>
接下來,在test目錄下,新建一個目錄in,并在in目錄中新建文件c.txt。然后,目錄和文件區分顯示
[注意]通過is_dir()函數判斷目錄時,需要加入路徑
<?phpif ($handle = opendir('test')) { while (false !== ($file = readdir($handle))) { if ($file != '.' && $file != '..') { $file = 'test/'.$file; if(is_dir($file)){ echo '目錄:'.$file.'<br>'; }else{ echo '文件:'.$file.'<br>'; } } } closedir($handle);}/*文件:test/a.txt文件:test/b.txt目錄:test/in */?>
rewinddir()
rewinddir()函數用于倒回目錄句柄,將參數dir_handle指定的目錄流重置到目錄的開頭
void rewinddir ( resource $dir_handle )
如果不使用rewinddir()函數,則文件只能遍歷一次
<?phpif ($handle = opendir('test')) { while (false !== ($file = readdir($handle))) { if ($file != '.' && $file != '..') { $file = 'test/'.$file; if(is_dir($file)){ echo '目錄:'.$file.'<br>'; }else{ echo '文件:'.$file.'<br>'; } } } while (false !== ($file = readdir($handle))) { if ($file != '.' && $file != '..') { $file = 'test/'.$file; if(is_dir($file)){ echo '目錄:'.$file.'<br>'; }else{ echo '文件:'.$file.'<br>'; } } } closedir($handle);}/*文件:test/a.txt文件:test/b.txt目錄:test/in */?>
使用rewinddir()函數,可以把目錄句柄返回到第一個文件,從而實現重新遍歷
<?phpif ($handle = opendir('test')) { while (false !== ($file = readdir($handle))) { if ($file != '.' && $file != '..') { $file = 'test/'.$file; if(is_dir($file)){ echo '目錄:'.$file.'<br>'; }else{ echo '文件:'.$file.'<br>'; } } } rewinddir($handle); while (false !== ($file = readdir($handle))) { if ($file != '.' && $file != '..') { $file = 'test/'.$file; if(is_dir($file)){ echo '目錄:'.$file.'<br>'; }else{ echo '文件:'.$file.'<br>'; } } } 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 )
<?php$ds = disk_total_space('C:');echo $ds.'<br>';//126652637184$ds = disk_total_space('D:');echo $ds;//1000202240000?>
disk_free_space()
disk_free_space()函數返回目錄中的可用空間
float disk_free_space ( string $directory )
<?php$ds = disk_free_space('C:');echo $ds.'<br>';//86087041024$ds = disk_free_space('D:');echo $ds;//481647472640?>
下面來統計在www文件夾下新建的test目錄的個數
<?php $dirn = 0; //目錄數 $filen = 0; //文件數 //統計一個目錄下的文件和目錄的個數 function getdirnum($file) { global $dirn; global $filen; $dir = opendir($file); while (false !== ($filename = readdir($dir))) { if($filename!='.' && $filename !='..') { $filename = $file.'/'.$filename; //更新路徑 if(is_dir($filename)) { $dirn++; getdirnum($filename); //遞歸,就可以查看所有子目錄 } else { $filen++; } } } closedir($dir); } getdirnum('test'); echo '目錄數為:{$dirn}<br>';//目錄數為:1 echo '文件數為:{$filen}<br>';//文件數為:3?>
下面來統計在www文件夾下新建的test目錄的大小
<?php //統計目錄大小 function dirsize($file) { $size = 0; $dir = opendir($file); while(false !== ($filename = readdir($dir))) { if($filename!='.' && $filename !='..') { $filename = $file.'/'.$filename; if(is_dir($filename)) { $size += dirsize($filename);//使用遞歸 } else { $size += filesize($filename); } } } closedir($dir); return $size; }echo 'test目錄大小為:'.dirsize('test').'<br>';//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目錄
<?php function deldir($dirname) { //如果是文件,直接刪除即可 if(is_file($dirname)) { unlink($dirname); } $dir = opendir($dirname); while(FALSE !== ($filename = readdir($dir))) { if($filename !='.' && $filename!='..') { $filename = $dirname.'/'.$filename; if(is_dir($filename)) { deldir($filename);//遞歸 }else { unlink($filename);//刪除文件 } } } closedir($dir); if($dirname != 'test'){ rmdir($dirname);//刪除目錄 } } deldir('test');?>
copy()
copy()函數用于拷貝文件
bool copy ( string $source , string $dest [, resource $context ] )
[注意]copy()函數不能用于復制目錄
<?php$file = 'a.txt';$newfile = 'a.bak';copy($file, $newfile);?>
rename()
rename()函數用于重命名一個文件或目錄
bool rename ( string $oldname , string $newname [, resource $context ] )
[注意]rename()函數具有移動文件或目錄的功能
下面把www目錄下的test目錄剪貼,命名為t,并移動到d盤目錄下
<?phprename('test', 'd:/t');?>
使用rename()只能實現剪切的操作,使用copy()只能復制文件。如果要復制目錄,則需要使用循環和遍歷
<?php /** * $dirsrc 原目錄 * $dirto 目標目錄 */ function copydir($dirsrc, $dirto) { //如果目錄不存在,則新建一個目錄 if(!file_exists($dirto)) { mkdir($dirto); } $dir = opendir($dirsrc); while(FALSE !== ($filename = readdir($dir))) { if($filename != '.' && $filename !='..') { $srcfile = $dirsrc.'/'.$filename; //原文件 $tofile = $dirto.'/'.$filename; //目標文件 if(is_dir($srcfile)) { copydir($srcfile, $tofile); //遞歸處理所有子目錄 }else{ copy($srcfile, $tofile);//復制文件 } } } } copydir('test', 'd:/t');?>
touch()
touch()函數用來設定文件的訪問和修改時間。如果文件不存在,則會被創建。成功時返回 TRUE, 或者在失敗時返回 FALSE
bool touch ( string $filename [, int $time = time() [, int $atime ]] )
參數filename表示要設定的文件名,time表示要設定的時間。如果沒有提供參數 time 則會使用當前系統的時間;atime表示如果給出了這個參數,則給定文件的訪問時間會被設為atime,否則會設置為time。如果沒有給出這兩個參數,則使用當前系統時間
<?php touch('abc.txt')?>
copy()
copy()函數用于拷貝文件
bool copy ( string $source , string $dest [, resource $context ] )
[注意]copy()函數不能用于復制目錄
<?php$file = 'a.txt';$newfile = 'a.bak';copy($file, $newfile);?>
rename()
rename()函數用于重命名一個文件或目錄
bool rename ( string $oldname , string $newname [, resource $context ] )
[注意]rename()函數具有移動文件或目錄的功能
<?phprename('abc.txt', 'd:/cba.txt');?>
unlink()
unlink()函數用于刪除文件
bool unlink ( string $filename [, resource $context ] )
<?phpunlink('d:/cba.txt');?>
fopen()
fopen()函數用于打開文件或者URL,fopen()將 filename 指定的名字資源綁定到一個流上
fopen() 中 mode 的可能值列表
mode 說明'r' 只讀方式打開,將文件指針指向文件頭。'r+' 讀寫方式打開,將文件指針指向文件頭。'w' 寫入方式打開,將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創建之。'w+' 讀寫方式打開,將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創建之。'a' 寫入方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創建之。'a+' 讀寫方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創建之。
<?php //使用絕對路徑打開file.txt文件,選擇只讀模式,并返回資源$handle $handle = fopen('/home/rasmus/file.txt', 'r'); //訪問文檔根目錄下的文件,也以只讀模式打開 $handle = fopen(“{$_SERVER['DOCUMENT_ROOT']}/data/info.txt', 'r'); //在 Windows 平臺上,轉義文件路徑中的每個反斜線,或者用斜線, 以二進制和只寫模式組合 $handle = fopen('c:/data/file.gif', 'wb'); //使用相對路徑打開file.txt文件,選擇只讀模式,并返回資源$handle $handle = fopen('../data/info.txt', 'r'); //打開遠程文件, 使用HTTP協議只能以只讀的模式打開 $handle = fopen('http://www.example.com/', 'r'); //使用FTP協議打開遠程文件,如果FTP服務器可寫,則可以以寫的模式打開 $handle = fopen('ftp://user:[email protected]/somefile.txt', 'w');?>
fclose()
fclose()函數用于關閉一個已打開的文件指針
bool fclose ( resource $handle )
<?php$handle = fopen('test/a.txt', 'r');fclose($handle);?>
fwrite()
fwrite()函數用于寫入文件(可安全用于二進制文件),返回寫入的字符數,出現錯誤時則返回 FALSE
int fwrite ( resource $handle , string $string [, int $length ] )
當打開方式為只讀模式時,無法向文件寫入字符
<?php$fp = fopen('test/a.txt', 'r');echo fwrite($fp, '1');//0echo '<br>';echo fwrite($fp, '23');//0echo '<br>';fclose($fp);?>
當打開方式為寫模式時,可以向文件寫入字符
<?php$fp = fopen('test/a.txt', 'w');echo fwrite($fp, '1');//1echo '<br>';echo fwrite($fp, '23');//2echo '<br>';fclose($fp);/*文件內容為123 */?>
當打開方式為追加模式時,將向文件的尾部追加新的字符
<?php$fp = fopen('test/a.txt', 'a');echo fwrite($fp, '1');//1echo '<br>';echo fwrite($fp, '23');//2echo '<br>';fclose($fp);/*刷新兩次時,文件內容為123123 */?>
fgetc()
fgetc()函數用于從文件指針中讀取字符
[注意]使用fgetc()函數時,需要在fopen()函數中使用讀模式
string fgetc ( resource $handle )
<?php$fp = fopen('test/a.txt', 'r');echo fgetc($fp);//1echo fgetc($fp);//2echo fgetc($fp);//3fclose($fp);?>
feof()
feof()函數用于測試文件指針是否到了文件結束的位置
bool feof ( resource $handle )
<?php$fp = fopen('test/a.txt', 'r');while(!feof($fp)){ echo fgetc($fp);//123123}fclose($fp);?>
fgets()
fgets()函數用于從文件指針中讀取一行
string fgets ( resource $handle [, int $length ] )
將test目錄下的a.txt文件內容修改為
aabbb
<?php$fp = fopen('test/a.txt', 'r');echo fgets($fp);//'aa'echo fgets($fp);//'bbb'echo fgets($fp);//''fclose($fp);?>
fread()
fread()函數用于讀取文件(可安全用于二進制文件)。fread()從文件指針handle讀取最多length個字節。該函數在讀取了length個字節或到達了文件末尾(EOF)時將停止讀取文件
string fread ( resource $handle , int $length )
<?php$fp = fopen('test/a.txt', 'r');echo fread($fp,3);//'aa 'fclose($fp);$fp = fopen('test/a.txt', 'r');echo fread($fp,filesize('test/a.txt'));//'aa bbb'fclose($fp);?>
fseek()
fseek()函數用于在文件指針中定位,成功則返回 0;否則返回 -1
int fseek ( resource $handle , int $offset [, int $whence = SEEK_SET ] )
將test目錄下的a.txt文件內容修改為'12345'
<?php$fp = fopen('test/a.txt', 'r');echo fgetc($fp);//'1'fseek($fp,4);echo fgetc($fp);//'5'fclose($fp);?>
<?php$fp = fopen('test/a.txt', 'r');echo fread($fp,2).'<br>';//12fseek($fp,4);echo fread($fp,2).'<br>';//5fseek($fp,-3,SEEK_END);echo fread($fp,2).'<br>';//34fclose($fp);?>
ftell()
ftell()函數用于返回文件指針讀/寫的位置
int ftell ( resource $handle )
<?php$fp = fopen('test/a.txt', 'r');echo ftell($fp);//0fgetc($fp);echo ftell($fp);//1fseek($fp,4);echo ftell($fp);//4fclose($fp);?>
rewind()
rewind()函數用于倒回文件指針的位置,將handle的文件位置指針設為文件流的開頭
bool rewind ( resource $handle )
<?php$fp = fopen('test/a.txt', 'r');fseek($fp,2);echo ftell($fp);//2rewind($fp);echo ftell($fp);//0?>
file_get_contents()
file_get_contents()函數用于將整個文件讀入一個字符串
string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] )
<?php$homepage = file_get_contents('test/a.txt');echo $homepage;//'12345'?>
頁面變為百度首頁
<?php$homepage = file_get_contents('http://www.baidu.com/');echo $homepage;?>
file_put_contents()
file_put_contents()函數用于將一個字符串寫入文件
int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )
使用該函數和依次調用 fopen(),fwrite() 以及 fclose() 功能一樣
[注意]默認為寫模式,若設置第三個參數為FILE_APPEND,則變為追加模式
<?phpfile_put_contents('test/a.txt','abc');?>
readfile()
readfile()函數用于讀取文件并寫入到輸出緩沖
int readfile ( string $filename [, bool $use_include_path = false [, resource $context ]] )
<?phpreadfile('http://www.baidu.com/');//頁面中顯示百度首頁?><?phpreadfile('test/a.txt');//頁面中顯示abc?>
file()
file()函數用于把整個文件讀入一個數組中,每一行作為一個數組的元素
array file ( string $filename [, int $flags = 0 [, resource $context ]] )
將a.txt的文件內容改為每一行一個數字,分別是1、2、3、4、5、6、7、8、9
<?php$arr = file('test/a.txt',0);echo $arr[0].'<br>';//1echo count($arr);//9?>
ftruncate()
ftruncate()函數用于將文件截斷到給定的長度
bool ftruncate ( resource $handle , int $size )
[注意]使用ftruncate()函數時,需要使用追加模式。經測試,使用讀模式時無效,使用寫模式時,文件內容被清空
<?php$fp = fopen('test/a.txt','a');ftruncate($fp,100);?>PHP編程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
|
新聞熱點
疑難解答