PHP函數(shù)參考09-文件系統(tǒng)函數(shù)與擴展類



原文:
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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

推薦閱讀更多精彩內(nèi)容