2009年1月19日星期一

SPL DirectoryIterator

DirectoryIterator 提供目录迭代功能。可替换 opendir() 和 dir 伪类功能。

opendir() 写法:
$path = '.';
if (is_dir($path)) {
if ($dh = opendir($path)) {
while (false !== ($file = readdir($dh))) {
echo "filename: $file \tfiletype: ", filetype($path . $file), "\n";
}
closedir($dh);
}
}


dir 伪类写法:
$path = '.';
$dir = dir($path);
while (false !== ($entry = $dir->read())) {
echo $entry, "\n";
}
$dir->close();


主角出场:
$path = '.';
$dir = new DirectoryIterator($path);
foreach ($dir as $fileinfo) {
echo 'filename:', $fileinfo->getFilename(), "\tfiletype:", $fileinfo->getType(), "\n";
}


参考资料:
http://www.php.net/manual/en/class.directoryiterator.php
http://www.php.net/manual/en/class.splfileinfo.php
http://www.php.net/~helly/php/ext/spl/

2009年1月8日星期四

SPL File Object

class SplFileObject extends SplFileInfo implements RecursiveIterator, SeekableIterator
SPL 文件对象继承自 SplFileInfo, 实现了 RecursiveIterator, SeekableIterator 接口。

一般我们访问文件方式:

$filename = '/path/ to/file';
$fp = fopen($filename, 'r');
if ($fp) {
while (!feof($fp)) {
$text = fgets($fp);
echo $text;
}
fclose($fp);
}


利用 SplFileObject 我们可以这么写:

$filename = '/path/ to/file';
$file = new SplFileObject($filename);
$file->openFile();
foreach ($file as $line) {
echo $line;
}

因为 SplFileObject 实现了RecursiveIterator 迭代器接口, foreach 可以很方便的访问到它。

写文件:

$filename = '/path/to/file';
$file = new SplFileObject($filename);
$file->openFile('w');
$file->fwrite('some text');


继承自 SplFileInfo 的一些方法:

echo '修改时间:', $file->getMTime(), "\n";
echo '所在路径:', $file->getPath(), "\n";
echo '文件名:', $file->getFilename(), "\n";
echo '全路径(路径+文件名):', $file->getPathname(), "\n";



更多方法请参考 Spl 文档