原文:
PHP函數(shù)參考09-文件系統(tǒng)函數(shù)與擴展類 - 9ong
PHP函數(shù)參考10-GetText國際化解決方案 - 9ong
目錄
Directory類
注意:Directory 實例是通過調(diào)用 dir() 函數(shù)創(chuàng)建的,而不是 new 操作符。
- Directory::close — 釋放目錄句柄
- Directory::read — 從目錄句柄中讀取條目
- Directory::rewind — 倒回目錄句柄
Directory類全貌:
Directory {
/* 屬性 */
public string $path;
public resource $handle;
/* 方法 */
public close([ resource $dir_handle] ) : void
public read([ resource $dir_handle] ) : string
public rewind([ resource $dir_handle] ) : void
}
目錄函數(shù)
- chdir — 改變目錄
- chroot — 改變根目錄
- closedir — 關(guān)閉目錄句柄
- dir — 返回一個 Directory 類實例
- getcwd — 取得當前工作目錄
- opendir — 打開目錄句柄
- readdir — 從目錄句柄中讀取條目
- rewinddir — 倒回目錄句柄
- scandir — 列出指定路徑中的文件和目錄
opendir、readdir、scandir、closedir等目錄函數(shù)實現(xiàn)和Directory類相同的功能。
$dir = "/tmp/";
if ($handle = opendir($dir)) {
echo "Directory handle: $handle\n";
echo "Files:\n";
/* 這是正確地遍歷目錄方法 */
while (false !== ($file = readdir($handle))) {
echo "$file\n";
}
closedir($handle);
}
$files = scandir($dir);
print_r($files);
Fileinfo
本模塊中的函數(shù)通過在文件的給定位置查找特定的 magic.mime來猜測文件的內(nèi)容類型以及編碼。雖然不是百分百的精確,但是通常情況下能夠很好的工作。
常用的函數(shù)有:finfo_open、finfo_file、finfo_close、mime_content_type
$finfo = finfo_open(FILEINFO_MIME_TYPE); // 返回 mime 類型資源
//遍歷當下目錄文件
foreach (glob("*") as $filename) {
echo finfo_file($finfo, $filename) . "\n";//判斷每個文件的mimetype
}
finfo_close($finfo);
echo "\n\n";
echo mime_content_type('test.zip') . "\n";
echo mime_content_type('test.php') . "\n";
php還提供了finfo類,也是對上面函數(shù)的改造,采用對象的方式實現(xiàn)。
xattr擴展
xattr擴展允許對文件系統(tǒng)上的擴展屬性進行操作。
需要額外安裝pecl擴展。
xattr擴展函數(shù)很簡單:
- xattr_set:為文件設(shè)置擴展屬性信息
- xattr_get:獲取文件曾設(shè)置過的擴展屬性信息
- xattr_remove:刪除文件擴展屬性信息
- xattr_list:文件擴展屬性信息列表
- xattr_supported:檢查文件系統(tǒng)是否支持擴展信息
$file = 'some_file';
if(xattr_supported($file)){
echo "文件系統(tǒng)支持擴展屬性信息xattr\n";
}else{
echo "文件系統(tǒng)不支持擴展屬性信息xattr\n";
exit;
}
xattr_set($file,'Artist',"Someone");
xattr_set($file,'Rank',"123");
echo xattr_get($file,"Rank",XATTR_ROOT);
$attributes = xattr_list($file);
foreach ($attributes as $attr_name) {
xattr_remove($file, $attr_name);
}
xdiff
xdiff擴展使您能夠創(chuàng)建和應(yīng)用補丁文件,其中包含不同版本文件之間的差異。
這個擴展支持兩種操作模式:字符串和文件,以及兩種不同的補丁格式:統(tǒng)一和二進制。統(tǒng)一補丁非常適合于文本文件,因為它們易于閱讀且易于檢查。對于像檔案或圖像這樣的二進制文件,二進制補丁將是足夠的選擇,因為它們是二進制安全的,并且可以很好地處理不可打印的字符。
需要額外安裝pecl擴展。
文件系統(tǒng)函數(shù)
文件系統(tǒng)是文件系統(tǒng)相關(guān)擴展的核心部分。有很多很常用的函數(shù),這里將看起來熟悉又陌生的函數(shù)再梳理一下:
-
basename — 返回路徑中的文件名部分
basename() 純粹基于輸入字符串操作,它不會受實際文件系統(tǒng)和類似 ".." 的路徑格式影響。
在 Windows 中,斜線(/)和反斜線(\)都可以用作目錄分隔符。在其它環(huán)境下是斜線(/)。dirname函數(shù)也一樣。
echo basename("/etc/sudoers.d", ".d").PHP_EOL; //1) sudoers
-
dirname — 返回路徑中的目錄部分
給出一個包含有指向一個文件的全路徑的字符串,本函數(shù)返回去掉文件名后的目錄名,且目錄深度為 levels 級,也就是要向上的父目錄數(shù)量,默認是上1級(levels)
dirname() 純粹基于輸入字符串操作,且與斜線有關(guān)。在 Windows 中,斜線(/)和反斜線(\)都可以用作目錄分隔符。在其它環(huán)境下是斜線(/)。
echo dirname("/usr/local/lib"); //輸出:/usr/local echo dirname("/usr/local/lib", 2); //輸出:/usr
-
pathinfo — 返回文件路徑的信息
pathinfo( string $path[, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME] ) : mixed
pathinfo() 返回一個關(guān)聯(lián)數(shù)組包含有 path 的信息。返回關(guān)聯(lián)數(shù)組還是字符串取決于 options。
同時關(guān)注:dirname、basename、realpath、parse_url函數(shù)
-
chgrp — 改變文件所屬的組
只有超級用戶可以任意修改文件的組,其它用戶可能只能將文件的組改成該用戶自己所在的組。
-
chmod — 改變文件模式
第二個參數(shù)只支持八進制:0755,0644等
chmod("/somedir/somefile", 0755); // 八進制數(shù),正確的 mode 值 chmod("/somedir/somefile", 755); // 十進制數(shù),可能不對 chmod("/somedir/somefile", "u+rwx,go+rx"); // 字符串,不對
-
chown — 改變文件的所有者
只有超級用戶可以改變文件的所有者。
-
clearstatcache — 清除文件狀態(tài)緩存
當使用 stat(),lstat() 或者任何列在受影響函數(shù)表(見下面)中的函數(shù)時,PHP 將緩存這些函數(shù)的返回信息以提供更快的性能。然而在某些情況下,你可能想清除被緩存的信息。例如如果在一個腳本中多次檢查同一個文件,而該文件在此腳本執(zhí)行期間有被刪除或修改的危險時,你需要清除文件狀態(tài)緩存。這種情況下,可以用 clearstatcache() 函數(shù)來清除被 PHP 緩存的該文件信息。
copy — 拷貝文件
-
delete — 參見 unlink 或 unset
在 PHP 語言里,沒有 delete 關(guān)鍵詞或函數(shù)。在這里,你若要刪除文件,可以使用 unlink()。在本地作用域刪除變量可使用 unset()。
disk_free_space — 返回目錄中的可用空間
disk_total_space — 返回一個目錄的磁盤總大小
diskfreespace — disk_free_space 的別名
fclose — 關(guān)閉一個已打開的文件指針
feof — 測試文件指針是否到了文件結(jié)束的位置
fflush — 將緩沖內(nèi)容輸出到文件
-
fgetc — 從文件指針中讀取字符
返回一個包含有一個字符的字符串,該字符從 handle 指向的文件中得到。碰到 EOF 則返回 FALSE。
-
fgets — 從文件指針中讀取一行
從 handle 指向的文件中讀取一行并返回長度最多為 length - 1 字節(jié)的字符串。碰到換行符(包括在返回值中)、EOF 或者已經(jīng)讀取了 length - 1 字節(jié)后停止(看先碰到那一種情況)。如果沒有指定 length,則默認為 1K,或者說 1024 字節(jié)。
while (($buffer = fgets($handle, 4096)) !== false) { echo $buffer; }
-
fgetss — 從文件指針中讀取一行并過濾掉 HTML 標記
和 fgets() 相同,只除了 fgetss() 嘗試從讀取的文本中去掉任何 HTML 和 PHP 標記。
$handle = fopen("./test.html","r"); if($handle){ while(false !== ($line = fgetss($handle, 1024))){ echo $line.PHP_EOL; } }
-
fread — 讀取文件(可安全用于二進制文件)
可安全用于二進制文件。
-
fputs — fwrite 的別名
可安全用于二進制文件。
-
fwrite
可安全用于二進制文件。
fwrite() 把 string 的內(nèi)容寫入文件指針 handle 處。
-
fgetcsv — 從文件指針中讀入一行并解析 CSV 字段
和 fgets() 類似,只除了 fgetcsv() 解析讀入的行并找出 CSV 格式的字段然后返回一個包含這些字段的數(shù)組。
返回一個數(shù)組。
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { ... }
-
fputcsv — 將行格式化為 CSV 并寫入文件指針
fputcsv() 將一行(用 fields 數(shù)組傳遞)格式化為 CSV 格式并寫入由 handle 指定的文件
-
file_exists — 檢查文件或目錄是否存在
對于符號鏈接的文件,如果指向文件不存在,即使符號鏈接文件存在,該函數(shù)仍然判斷為文件不存在。
-
file_get_contents — 將整個文件讀入一個字符串
和 file() 一樣,只除了 file_get_contents() 把文件讀入一個字符串。
// Read 14 characters starting from the 21st character $section = file_get_contents('./people.txt', NULL, NULL, 20, 14);
雖然該函數(shù)支持stream contexts,但對于http協(xié)議,我們還是建議采用比較友好的包,比如guzzle
-
file_put_contents — 將一個字符串寫入文件
和依次調(diào)用 fopen(),fwrite() 以及 fclose() 功能一樣。
如果filename不存在,則創(chuàng)建該文件。否則,現(xiàn)有的文件將被覆蓋,除非設(shè)置了FILE_APPEND標志。
-
file — 把整個文件讀入一個數(shù)組中
file( string $filename[, int $flags = 0[, resource $context]] ) : array
與file_get_content是一樣的,只是返回的類型不一樣,一個是數(shù)組,一個是字符串。
在$flags參數(shù)可以設(shè)置FILE_SKIP_EMPTY_LINES跳過空行,設(shè)置FILE_IGNORE_NEW_LINES 忽略換行符。
同樣也支持流上下文:
$trimmed = file('http://www.example.com/', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
fileatime — 取得文件的上次訪問時間
-
filectime — 取得文件的 inode 修改時間
注意是文件inode的修改時間,而不是文件的創(chuàng)建時間,也不是web上所想要的文件修改時間。
在大多數(shù) Unix 文件系統(tǒng)中,當一個文件的 inode 數(shù)據(jù)被改變時則該文件被認為是修改了。也就是說,當文件的權(quán)限,所有者,所有組或其它 inode 中的元數(shù)據(jù)被更新時。
注意某些 Unix 說明文本中把 ctime 說成是該文件建立的時間,這是錯的。在大多數(shù) Unix 文件系統(tǒng)中沒有 Unix 文件的建立時間。
filegroup — 取得文件的組
fileinode — 取得文件的 inode
-
filemtime — 取得文件修改時間
本函數(shù)返回文件中的數(shù)據(jù)塊上次被寫入的時間,也就是說,文件的內(nèi)容上次被修改的時間。
這個是區(qū)別于filectime函數(shù)(獲取inode的上次修改時間)。
注意:此函數(shù)的結(jié)果會被緩存。有需要時,可以緊跟clearstatcache函數(shù)。
fileowner — 取得文件的所有者
fileperms — 取得文件的權(quán)限
filesize — 取得文件大小
-
filetype — 取得文件類型
注意:以上從fileatime開始到filetype函數(shù),這些函???都是和文件相關(guān)信息的獲取,都會被緩存。
-
flock — 輕便的訪問文件鎖定
flock() 允許執(zhí)行一個簡單的可以在任何平臺中使用的讀取/寫入模型。
在文件資源句柄關(guān)閉時不會自動解鎖,需要手動解鎖。
flock( resource $handle, int $operation[, int &$wouldblock] ) : bool
operation 可以是以下值之一:
- LOCK_SH取得共享鎖定(讀取的程序)。
- LOCK_EX 取得獨占鎖定(寫入的程序。
- LOCK_UN 釋放鎖定(無論共享或獨占)。
fnmatch — 用模式匹配文件名
-
fopen — 打開文件或者 URL
fopen() 將 filename 指定的名字資源綁定到一個流上。
- 'r+' 讀寫方式打開,將文件指針指向文件頭。
- 'w+' 讀寫方式打開,將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創(chuàng)建之。
- 'a+' 讀寫方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之。
- 'b' 打開是否為二進制,用“b”標識;可以結(jié)合rb、wb、ab
- 't' 打開為文本文件,可以結(jié)合rt、wt、at
為移植性考慮,強烈建議在用 fopen() 打開文件時總是使用 'b' 標記。
$handle = fopen("/home/rasmus/file.gif", "wb");
fpassthru — 輸出文件指針處的所有剩余數(shù)據(jù)
-
fscanf — 從文件中格式化輸入
每次調(diào)用 fscanf() 都會從文件中讀取一行。
while ($userinfo = fscanf($handle, "%s\t%s\t%s\n")) { list ($name, $profession, $countrycode) = $userinfo; //... do something with the values }
fseek — 在文件指針中定位
-
fstat — 通過已打開的文件指針取得文件信息
獲取由文件指針 handle 所打開文件的統(tǒng)計信息。本函數(shù)和 stat() 函數(shù)相似,除了它是作用于已打開的文件指針而不是文件名。
ftell — 返回文件指針讀/寫的位置
ftruncate — 將文件截斷到給定的長度
-
glob — 尋找與模式匹配的文件路徑
foreach (glob("/tmp/*.php") as $filename) { echo "$filename size " . filesize($filename) . PHP_EOL; }
is_dir — 判斷給定文件名是否是一個目錄
is_executable — 判斷給定文件名是否可執(zhí)行
-
is_file — 判斷給定文件名是否為一個正常的文件
因為 PHP 的整數(shù)類型是有符號整型而且很多平臺使用 32 位整型,對 2GB 以上的文件,一些文件系統(tǒng)函數(shù)可能返回無法預(yù)期的結(jié)果。
is_link — 判斷給定文件名是否為一個符號連接
-
is_readable — 判斷給定文件名是否可讀
記住 PHP 也許只能以運行 webserver 的用戶名(比如 'nobody','www-data'等)來訪問文件.
is_uploaded_file — 判斷文件是否是通過 HTTP POST 上傳的
is_writable — 判斷給定的文件名是否可寫
is_writeable — is_writable 的別名
lchgrp — 修改符號鏈接的所有組
lchown — 修改符號鏈接的所有者
link — 建立一個硬連接
linkinfo — 獲取一個連接的信息
-
lstat — 給出一個文件或符號連接的信息
獲取由 filename 指定的文件或符號連接的統(tǒng)計信息。
本函數(shù)和 stat() 函數(shù)相同,只除了如果 filename 參數(shù)是符號連接的話,則該符號連接的狀態(tài)被返回,而不是該符號連接所指向的文件的狀態(tài)。
注意:符號鏈接文件(不是硬鏈接)和指向文件的inode是不一樣的,所以stat和lstat對于同一個符號鏈接文件輸出的統(tǒng)計信息是不一樣的,stat統(tǒng)計的是符號鏈接文件指向的源文件,lstat統(tǒng)計的是符號鏈接本身文件。
-
mkdir — 新建目錄
一定要確保有操作權(quán)限,另外mkdir第二個參數(shù)支持mode的修改,第三個參數(shù)支持嵌套創(chuàng)建不存在的目錄。
if (!mkdir($structure, 0777, true)) { die('Failed to create folders...'); }
move_uploaded_file — 將上傳的文件移動到新位置
-
parse_ini_file — 解析一個配置文件
parse_ini_file() 載入一個由 filename 指定的 ini 文件,并將其中的設(shè)置作為一個聯(lián)合數(shù)組返回。
注意:ini 文件的結(jié)構(gòu)和 php.ini 的相似。
比如:
; This is a sample configuration file ; Comments start with ';', as in php.ini [first_section] one = 1 five = 5 animal = BIRD [second_section] path = "/usr/local/bin" URL = "http://www.example.com/~username"
第二個參數(shù)為true支持返回多維數(shù)組:
$ini_array = parse_ini_file("sample.ini", true); print_r($ini_array); 輸出: Array ( [first_section] => Array ( [one] => 1 [five] => 5 [animal] => Dodo bird ) [second_section] => Array ( [path] => /usr/local/bin [URL] => http://www.example.com/~username ) )
-
parse_ini_string — 解析配置字符串
同parse_ini_file,只不過輸入是字符串而不是ini文件。
字符串格式仍然與php.ini類似。
-
popen — 打開進程文件指針
返回一個和 fopen() 所返回的相同的文件指針,只不過它是單向的(只能用于讀或?qū)懀┎⑶冶仨氂?pclose() 來關(guān)閉。此指針可以用于 fgets(),fgetss() 和 fwrite()。當模式為 'r',返回的文件指針等于命令的 STDOUT,當模式為 'w',返回的文件指針等于命令的 STDIN。
$handle = popen("/bin/ls", "r");
如果需要雙向支持,使用 proc_open()。
pclose — 關(guān)閉進程文件指針
-
readfile — 輸出文件
讀取文件并寫入到輸出緩沖。
-
readlink — 返回符號連接指向的目標
readlink() 和同名的 C 函數(shù)做同樣的事,返回符號連接的內(nèi)容。
符號連接的內(nèi)容其實是指向文件的名稱。
realpath_cache_get — 獲取真實目錄緩存的詳情
realpath_cache_size — 獲取真實路徑緩沖區(qū)的大小
-
realpath — 返回規(guī)范化的絕對路徑名
就是絕對路徑的返回。
-
rename — 重命名一個文件或目錄
嘗試把 oldname 重命名為 newname,必要時會在不同目錄間移動。如果重命名文件時 newname 已經(jīng)存在,將會覆蓋掉它。如果重命名文件夾時 newname 已經(jīng)存在,本函數(shù)將導(dǎo)致一個警告。
-
rewind — 倒回文件指針的位置
倒回的意思就是將 handle 的文件位置指針設(shè)為文件流的開頭。
-
rmdir — 刪除目錄
和linux命令rmdir是一樣的,嘗試刪除 dirname 所指定的目錄。該目錄必須是空的,而且要有相應(yīng)的權(quán)限。
set_file_buffer — stream_set_write_buffer 的別名
-
stat — 給出文件的信息
獲取由 filename 指定的文件的統(tǒng)計信息。如果 filename 是符號連接,則統(tǒng)計信息是關(guān)于被連接文件本身的,而不是符號連接。可以參考lstat。
-
symlink — 建立符號連接
首先要弄清楚硬連接與符號連接的區(qū)別。
通過link函數(shù)創(chuàng)建硬連接。
-
tempnam — 建立一個具有唯一文件名的文件
在指定目錄中建立一個具有唯一文件名的文件。如果該目錄不存在,tempnam() 會在系統(tǒng)臨時目錄中生成一個文件,并返回其文件名。
-
tmpfile — 建立一個臨時文件
以讀寫(w+)模式建立一個具有唯一文件名的臨時文件,返回一個文件句柄。
文件會在關(guān)閉后(用 fclose())自動被刪除,或當腳本結(jié)束后。
-
touch — 設(shè)定文件的訪問和修改時間
touch( string $filename[, int $time = time()[, int $atime]] ) : bool
嘗試將由 filename 給出的文件的訪問和修改時間設(shè)定為給出的 time。注意訪問時間總是會被修改的,不論有幾個參數(shù)。
-
umask — 改變當前的 umask
不清楚linux的umask的話,不建議隨便改動。Linux umask命令 | 菜鳥教程
umask() 將 PHP 的 umask 設(shè)定為 mask & 0777 并返回原來的 umask。當 PHP 被作為服務(wù)器模塊使用時,在每個請求結(jié)束后 umask 會被恢復(fù)。
假設(shè)當前系統(tǒng)的umask是022,則通過mkdir創(chuàng)建目錄的權(quán)限為:
"drwxr-xr-x" = "777-022 = 755"
unlink — 刪除文件
原文:
PHP函數(shù)參考09-文件系統(tǒng)函數(shù)與擴展類 - 9ong
PHP函數(shù)參考10-GetText國際化解決方案 - 9ong