PHP 檔案操作的各種姿勢

麥索發表於2019-02-26

使用 SPL 庫

SPL 是 PHP 標準庫,用於解決典型問題的一組介面與類的集合。

迭代器 FilesystemIterator

官方文件:php.net/manual/zh/c…

類摘要:

FilesystemIterator extends DirectoryIterator implements SeekableIterator {

/* 常量 */
const integer CURRENT_AS_PATHNAME = 32 ;
const integer CURRENT_AS_FILEINFO = 0 ;
const integer CURRENT_AS_SELF = 16 ;
const integer CURRENT_MODE_MASK = 240 ;
const integer KEY_AS_PATHNAME = 0 ;
const integer KEY_AS_FILENAME = 256 ;
const integer FOLLOW_SYMLINKS = 512 ;
const integer KEY_MODE_MASK = 3840 ;
const integer NEW_CURRENT_AND_KEY = 256 ;
const integer SKIP_DOTS = 4096 ;
const integer UNIX_PATHS = 8192 ;

/* 方法 */
public __construct ( string $path [, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS ] )
public mixed current ( void )
public int getFlags ( void )
public string key ( void )
public void next ( void )
public void rewind ( void )
public void setFlags ([ int $flags ] )

/* 繼承的方法 */
public DirectoryIterator DirectoryIterator::current ( void )
public int DirectoryIterator::getATime ( void )
public string DirectoryIterator::getBasename ([ string $suffix ] )
public int DirectoryIterator::getCTime ( void )
public string DirectoryIterator::getExtension ( void )
public string DirectoryIterator::getFilename ( void )
public int DirectoryIterator::getGroup ( void )
public int DirectoryIterator::getInode ( void )
public int DirectoryIterator::getMTime ( void )
public int DirectoryIterator::getOwner ( void )
public string DirectoryIterator::getPath ( void )
public string DirectoryIterator::getPathname ( void )
public int DirectoryIterator::getPerms ( void )
public int DirectoryIterator::getSize ( void )
public string DirectoryIterator::getType ( void )
public bool DirectoryIterator::isDir ( void )
public bool DirectoryIterator::isDot ( void )
public bool DirectoryIterator::isExecutable ( void )
public bool DirectoryIterator::isFile ( void )
public bool DirectoryIterator::isLink ( void )
public bool DirectoryIterator::isReadable ( void )
public bool DirectoryIterator::isWritable ( void )
public string DirectoryIterator::key ( void )
public void DirectoryIterator::next ( void )
public void DirectoryIterator::rewind ( void )
public void DirectoryIterator::seek ( int $position )
public string DirectoryIterator::__toString ( void )
public bool DirectoryIterator::valid ( void )
}複製程式碼

使用這個迭代器的方法很簡單,例項化的時候傳入的是目錄路徑,這個迭代器繼承自 DirectoryIterator 迭代器,而 DirectoryIterator 迭代器又繼承自 SplFileInfo 類,這個類我們後面介紹。

$fSI = new FileSystemIterator(`.`);
/** @var FileSystemIterator $fInfo */
// 模擬 windows dir
foreach ($fSI as $fInfo) {
    printf("%8s%8s%8s %8s
",
        date("Y-m-d H:i:s", $fInfo->getMtime()),
        $fInfo->isDir() ? `<DIR>` : ``,
        number_format($fInfo->getSize()),
        $fInfo->getFileName()
    );
}
// 模擬 linux ls
foreach ($fSI as $fInfo) {
    printf("%8s  ",
        $fInfo->getFileName()
    );
}複製程式碼

以上程式碼模擬了 windows 的 dir 和 linux 的 ls 功能。還有許多功能可以使用,看一下官方文件裡的方法列表就知道了,都是比較語義化的方法命名,比如 isFile 就是判斷一個檔案是不是檔案, getMTime 是獲取檔案的修改時間。

檔案處理類 SplFileInfo

官方文件:php.net/manual/zh/c…

SplFileInfo 這個類可以用來獲取檔案的基本資訊,如修改時間,大小。

SplFileObject 這個類操作檔案的內容,如讀取、寫入。

類摘要

SplFileInfo {

/* 方法 */
public __construct ( string $file_name )
public int getATime ( void )
public string getBasename ([ string $suffix ] )
public int getCTime ( void )
public string getExtension ( void )
public SplFileInfo getFileInfo ([ string $class_name ] )
public string getFilename ( void )
public int getGroup ( void )
public int getInode ( void )
public string getLinkTarget ( void )
public int getMTime ( void )
public int getOwner ( void )
public string getPath ( void )
public SplFileInfo getPathInfo ([ string $class_name ] )
public string getPathname ( void )
public int getPerms ( void )
public string getRealPath ( void )
public int getSize ( void )
public string getType ( void )
public bool isDir ( void )
public bool isExecutable ( void )
public bool isFile ( void )
public bool isLink ( void )
public bool isReadable ( void )
public bool isWritable ( void )
public SplFileObject openFile ([ string $open_mode = "r" [, bool $use_include_path = false [, resource $context = NULL ]]] )
public void setFileClass ([ string $class_name = "SplFileObject" ] )
public void setInfoClass ([ string $class_name = "SplFileInfo" ] )
public void __toString ( void )
}複製程式碼
$file = new SplFileInfo(`README.md`);
echo `File is created at ` . date(`Y-m-d H:i:s`, $file->getCTime()) . PHP_EOL;
echo `File is modified at ` . date(`Y-m-d H:i:s`, $file->getMTime()) . PHP_EOL;
echo `File size is ` . $file->getSize() . ` bytes` . PHP_EOL;

// openFile 方法返回的 SplFileObject 物件
// 讀取檔案裡面的內容
$fileObj = $file->openFile(`r`);
while($fileObj->valid()){
    echo $fileObj->fgets(); // 讀取檔案裡的一行資料
}

// 關閉開啟的檔案
$fileObj = null;
$file = null;複製程式碼

函式

目錄相關函式:php.net/manual/zh/r…
檔案系統函式:php.net/manual/zh/r…

以上官方文件都比較完善,並且翻譯完整使用自行學習。同時也有助於理解 SPL 的檔案操作,因為 SPL 裡的方法與這裡的函式命名是一致的。

相關文章