前言
本系列文章主要是根據實戰視頻《360大牛:全面解讀PHP面試》學習過程中記錄的學習筆記,期間也會加入查找資料和平時學習中學習到的知識。
fopen()函數
用來打開一個文件,打開時需要指定打開模式。
打開模式:
r/r+ r以只讀模式打開,並把文件指針指向文件開頭。r+以讀寫模式打開,並把文件指針指向文件開頭。
w/w+ w以只寫模式打開,並把文件指針指向文件開頭,同時把文件內容清空。w+以讀寫模式打開,並把文件指針指向文件開頭,同時把文件內容清空。w/w+模式打開時,若文件不存在,會創建文件。
a/a+ a以追加寫入方式打開,把文件指針指向文件末尾,當文件不存在時會創建文件。以追加讀寫方式打開,把文件指針指向文件末尾,當文件不存在時會創建文件。
x/x+ x以寫入模式打開,並且把文件指針指向文件開頭,若文件存在會發出一個warning的錯誤,同時fopen()返回false。文件不存在時會創建文件。x+創建且以讀寫模式打開。
b 打開二進制文件,配合上面8種模式打開
t 在windows下打開文件時,把 \n 轉換爲 \r\n ,配合上面8種模式打開
寫入函數
fwrite() 寫入文件(可安全用於二進制文件)
用法:int fwrite ( resource $handle , string $string [, int $length ] )
描述:把 string 的內容寫入 文件指針 handle 處。fwrite() 返回寫入的字符數,出現錯誤時則返回 FALSE 。
fputs() fwrite() 的別名
讀取函數
fread() 讀取文件(可安全用於二進制文件)
用法:string fread ( resource $handle , int $length )
描述:從文件指針 handle 讀取最多 length 個字節。返回所讀取的字符串, 或者在失敗時返回 FALSE。 該函數在遇上以下幾種情況時停止讀取文件:
①讀取了 length 個字節
②到達了文件末尾(EOF)
fgets() 從文件指針中讀取一行
用法:string fgets ( resource $handle [, int $length ] )
描述:從指針 handle 指向的文件中讀取了 length - 1 字節後返回字符串。 從php版本4.3起,如果fgets不寫length參數,默認是讀到行結束符爲止。如果文件指針中沒有更多的數據了則返回 FALSE。錯誤發生時返回 FALSE。
fgetc() 從文件指針中讀取字符
用法:string fgetc ( resource $handle )
描述:從文件句柄中獲取一個字符。返回一個包含有一個字符的字符串,該字符從 handle 指向的文件中得到。 碰到 EOF 則返回 FALSE。
關閉文件函數
fclose() 關閉一個已打開的文件指針
用法:bool fclose ( resource $handle )
描述:成功時返回 TRUE, 或者在失敗時返回 FALSE。
不需要fopen()打開的函數
file_get_contents() 將整個文件讀入一個字符串
用法:string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] )
描述:file_get_contents() 把文件讀入一個字符串。將在參數 offset 所指定的位置開始讀取長度爲 maxlen 的內容。如果失敗,file_get_contents() 將返回 FALSE。
file_get_contents() 函數是用來將文件的內容讀入到一個字符串中的首選方法。如果操作系統支持還會使用內存映射技術來增強性能。
例子:
<?php
$ctx = stream_context_create(
array(
'http' => array(
'method' => 'get',
'timeout' => 5,
)
)
);
$result = file_get_contents($url, false, $ctx);
file_put_contents() 將一個字符串寫入文件
用法:int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )
其他讀取函數
file() 把整個文件讀入一個數組中
用法:array file ( string $filename [, int $flags = 0 [, resource $context ]] )
readfile() 輸出文件
用法:int readfile ( string $filename [, bool $use_include_path = false [, resource $context ]] )
描述:讀取文件並寫入到輸出緩衝。
use_include_path:想要在 include_path 中搜索文件,可使用這個可選的第二個參數,設爲 TRUE。
返回從文件中讀入的字節數。如果出錯返回 FALSE 並且除非是以 @readfile() 形式調用,否則會顯示錯誤信息。
訪問遠程文件
開啓 allow_url_fopen,HTTP 協議連接只能使用只讀, FTP 協議可以使用只讀或者只寫。
目錄操作函數
名稱相關:
basename() 返回路徑中的文件名
用法:yongstring basename ( string $path [, string $suffix ] )
描述:給出一個包含有指向一個文件的全路徑的字符串,本函數返回基本的文件名。
path 一個路徑。在 Windows 中,斜線(/)和反斜線(\)都可以用作目錄分隔符。在其它環境下是斜線(/)。
例子:
<?php
echo "1) ".basename("/etc/sudoers.d", ".d").PHP_EOL; // 1) sudoers
echo "2) ".basename("/etc/sudoers.php").PHP_EOL; // 2) sudoers.php
echo "3) ".basename("/etc/passwd").PHP_EOL; // 3) passwd
echo "4) ".basename("/etc/").PHP_EOL; // 4) etc
echo "5) ".basename(".").PHP_EOL; // 5) .
echo "6) ".basename("/"); // 6)
dirname() 返回路徑中的目錄部分
用法:string dirname ( string $path )
用法:給出一個包含有指向一個文件的全路徑的字符串,本函數返回去掉文件名後的目錄名
path 一個路徑。在 Windows 中,斜線(/)和反斜線(\)都可以用作目錄分隔符。在其它環境下是斜線(/)。
返回 path 的父目錄。 如果在 path 中沒有斜線,則返回一個點('.'),表示當前目錄。否則返回的是把 path 中結尾的 /component(最後一個斜線以及後面部分)去掉之後的字符串。
例子:
<?php
echo "1) " . dirname("/etc/passwd") . PHP_EOL; // 1) /etc
echo "2) " . dirname("/etc/") . PHP_EOL; // 2) / (or \ on Windows)
echo "3) " . dirname("."); // 3) .
pathinfo() 返回文件路徑的信息
用法:mixed pathinfo ( string $path [, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME ] )
描述:pathinfo() 返回一個關聯數組包含有 path 的信息。返回關聯數組還是字符串取決於 options。如果指定了,將會返回指定元素;它們包括:PATHINFO_DIRNAME,PATHINFO_BASENAME 和 PATHINFO_EXTENSION 或 PATHINFO_FILENAME。如果沒有指定 options 默認是返回全部的單元。
例子:
<?php
$path_parts = pathinfo('/www/htdocs/inc/lib.inc.php');
echo $path_parts['dirname'], "\n"; // /www/htdocs/inc
echo $path_parts['basename'], "\n"; // lib.inc.php
echo $path_parts['extension'], "\n"; // php
echo $path_parts['filename'], "\n"; // lib.inc
目錄讀取
opendir() 打開目錄句柄
用法:resource opendir ( string $path [, resource $context ] )
描述:打開一個目錄句柄,可用於之後的 closedir(),readdir() 和 rewinddir() 調用中。如果成功則返回目錄句柄的 resource,失敗則返回 FALSE。如果 path 不是一個合法的目錄或者因爲權限限制或文件系統錯誤而不能打開目錄,opendir() 返回 FALSE 併產生一個 E_WARNING 級別的 PHP 錯誤信息。可以在 opendir() 前面加上“@”符號來抑制錯誤信息的輸出。
readdir() 從目錄句柄中讀取條目
用法:string readdir ([ resource $dir_handle ] )
描述:返回目錄中下一個文件的文件名。文件名以在文件系統中的排序返回。
成功則返回文件名 或者在失敗時返回 FALSE。
closedir() 關閉目錄句柄
用法:void closedir ([ resource $dir_handle ] )
描述:關閉由 dir_handle 指定的目錄流。
rewinddir() 倒回目錄句柄
用法:void rewinddir ( resource $dir_handle )
描述:將 dir_handle 指定的目錄流重置到目錄的開頭。
目錄刪除
rmdir()
描述:刪除目錄時,需保證目錄爲空,而且要有相應的權限。否則無法刪除。 失敗時會產生一個 E_WARNING
級別的錯誤。
目錄創建
mkdir() 新建目錄
用法:bool mkdir ( string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context ]]] )
描述:嘗試新建一個由 pathname 指定的目錄。
例子:
<?php
mkdir("/path/to/my/dir", 0700);
其他函數
文件大小
filesize() 取得文件大小
描述:返回文件大小的字節數,如果出錯返回 FALSE 並生成一條 E_WARNING 級的錯誤。
磁盤大小
disk_free_space() 返回目錄中的可用空間
用法:float disk_free_space ( string $directory )
描述:給出一個包含有一個目錄的字符串,本函數將根據相應的文件系統或磁盤分區返回可用的字節數。
disk_total_space() 返回一個目錄的磁盤總大小
用法:float disk_total_space ( string $directory )
描述:給出一個包含有一個目錄的字符串,本函數將根據相應的文件系統或磁盤分區返回所有的字節數。本函數返回的是該目錄所在的磁盤分區的總大小,因此在給出同一個磁盤分區的不同目錄作爲參數所得到的結果完全相同。
例子:
<?php
$ds = disk_total_space("/");
文件拷貝
copy() 拷貝文件
用法:bool copy ( string $source , string $dest [, resource $context ] )
描述將文件從 source 拷貝到 dest。如果目標文件已存在,將會被覆蓋。
刪除文件
unlink() 刪除文件
用法:bool unlink ( string $filename [, resource $context ] )
文件類型
filetype() 取得文件類型
用法:string filetype ( string $filename )
描述:返回文件的類型。 可能的值有 fifo,char,dir,block,link,file 和 unknown。
重命名文件或者目錄
rename() 重命名一個文件或目錄
用法:bool rename ( string $oldname , string $newname [, resource $context ] )
描述:嘗試把 oldname 重命名爲 newname。
例子:
<?php
rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt");
文件截取
ftruncate() 將文件截斷到給定的長度
用法:bool ftruncate ( resource $handle , int $size )
描述:接受文件指針 handle 作爲參數,並將文件大小截取爲 size。
例子:
<?php
$filename = 'lorem_ipsum.txt';
$handle = fopen($filename, 'r+');
ftruncate($handle, rand(1, filesize($filename)));
rewind($handle);
echo fread($handle, filesize($filename));
fclose($handle);
文件屬性
file_exists() 檢查文件或目錄是否存在
用法:bool file_exists ( string $filename )
is_readable() 判斷給定文件名是否可讀
用法:bool is_readable ( string $filename )
描述:判斷給定文件名是否存在並且可讀。
例子:
<?php
$filename = 'test.txt';
if (is_readable($filename)) {
echo 'The file is readable';
} else {
echo 'The file is not readable';
}
is_writable() 判斷給定的文件名是否可寫
用法:bool is_writable ( string $filename )
描述:如果文件存在並且可寫則返回 TRUE。
is_executable() 判斷給定文件名是否可執行
用法:bool is_executable ( string $filename )
filectime() 取得文件的 inode 創建時間
用法:int filectime ( string $filename )
fileatime() 取得文件的上次訪問時間
用法:int fileatime ( string $filename )
filemtime() 取得文件修改時間
用法:int filemtime ( string $filename )
描述:本函數返回文件中的數據塊上次被寫入的時間,也就是說,文件的內容上次被修改的時間。
文件鎖
flock() 輕便的諮詢文件鎖定
用法:bool flock ( resource $handle , int $operation [, int &$wouldblock ] )
描述:operation 可以是以下值之一:
LOCK_SH取得共享鎖定(讀取的程序)。
LOCK_EX 取得獨佔鎖定(寫入的程序。
LOCK_UN 釋放鎖定(無論共享或獨佔)。
如果不希望 flock() 在鎖定時堵塞,則是 LOCK_NB(Windows 上還不支持)。
例子:
<?php
$fp = fopen("/tmp/lock.txt", "r+");
if (flock($fp, LOCK_EX)) { // 進行排它型鎖定
ftruncate($fp, 0); // truncate file
fwrite($fp, "Write something here\n");
fflush($fp); // flush output before releasing the lock
flock($fp, LOCK_UN); // 釋放鎖定
} else {
echo "Couldn't get the lock!";
}
fclose($fp);
文件指針
ftell() 返回文件指針讀/寫的位置
用法:int ftell ( resource $handle )
描述:返回由 handle 指定的文件指針的位置,也就是文件流中的偏移量。
例子:
<?php
$fp = fopen("/etc/passwd", "r");
$data = fgets($fp, 12);
// where are we ?
echo ftell($fp); // 11
fclose($fp);
fseek() 在文件指針中定位
用法:int fseek ( resource $handle , int $offset [, int $whence = SEEK_SET ] )
描述:在與 handle 關聯的文件中設定文件指針位置。 新位置從文件頭開始以字節數度量,是以 whence 指定的位置加上 offset。要移動到文件尾之前的位置,需要給 offset 傳遞一個負值,並設置 whence 爲 SEEK_END。whence 的值包括:SEEK_SET - 設定位置等於 offset 字節。SEEK_CUR - 設定位置爲當前位置加上 offset。SEEK_END - 設定位置爲文件尾加上 offset。
例子:
<?php
$fp = fopen('somefile.txt', 'r');
// read some data
$data = fgets($fp, 4096);
// move back to the beginning of the file
// same as rewind($fp);
fseek($fp, 0);
rewind() 倒回文件指針的位置
用法:bool rewind ( resource $handle )
描述:將 handle 的文件位置指針設爲文件流的開頭。