Deleting all files in a directory except the one which is last modified.
<?php
$directory = dirname(__FILE__)."/demo";
$filenames = array();
$iterator = new DirectoryIterator($directory);
foreach ($iterator as $fileinfo) {
if ($fileinfo->isFile()) {
$filenames[$fileinfo->getMTime()] = $fileinfo->getFilename();
}
}
ksort($filenames);
print_r($filenames);
echo "\n";
$i=0;
if(sizeof($filenames)>1){
foreach ($filenames as $file){
if($i>0){
echo $file."\n";
unlink($directory."/".$file);
}
$i++;
}
}
?>
DirectoryIterator クラス
(PHP 5)
導入
DirectoryIterator クラスは、 ファイルシステムのディレクトリを閲覧するためのシンプルなインターフェイスです。
クラス概要
/* メソッド */
}目次
- DirectoryIterator::__construct — パスから新規ディレクトリイテレータを生成する
- DirectoryIterator::current — 現在の DirectoryIterator アイテムを返す
- DirectoryIterator::getATime — 現在の DirectoryIterator アイテムの最終アクセス時刻を取得する
- DirectoryIterator::getBasename — 現在の DirectoryIterator のアイテムのベース名を取得する
- DirectoryIterator::getCTime — 現在の DirectoryIterator アイテムの inode 修正時刻を取得する
- DirectoryIterator::getExtension — パスからファイルの拡張子の部分を返す
- DirectoryIterator::getFilename — 現在の DirectoryIterator アイテムのファイル名を返す
- DirectoryIterator::getGroup — 現在の DirectoryIterator アイテムのグループを取得する
- DirectoryIterator::getInode — 現在の DirectoryIterator アイテムの inode を取得する
- DirectoryIterator::getMTime — 現在の DirectoryIterator アイテムの最終修正時刻を取得する
- DirectoryIterator::getOwner — 現在の DirectoryIterator アイテムの所有者を取得する
- DirectoryIterator::getPath — 現在の Iterator アイテムのパスをファイル名抜きで返す
- DirectoryIterator::getPathname — 現在の DirectoryIterator アイテムのパスとファイル名を返す
- DirectoryIterator::getPerms — 現在の DirectoryIterator アイテムのパーミッションを取得する
- DirectoryIterator::getSize — 現在の DirectoryIterator アイテムのサイズを取得する
- DirectoryIterator::getType — 現在の DirectoryIterator アイテムのタイプを判定する
- DirectoryIterator::isDir — 現在の DirectoryIterator アイテムがディレクトリであるかどうかを調べる
- DirectoryIterator::isDot — 現在の DirectoryIterator アイテムが '.' もしくは '..' であるかどうかを調べる
- DirectoryIterator::isExecutable — 現在の DirectoryIterator アイテムが実行可能であるかどうかを調べる
- DirectoryIterator::isFile — 現在の DirectoryIterator アイテムが通常のファイルであるかどうかを調べる
- DirectoryIterator::isLink — 現在の DirectoryIterator アイテムがシンボリックリンクであるかどうかを調べる
- DirectoryIterator::isReadable — 現在の DirectoryIterator アイテムが読込可能であるかどうかを調べる
- DirectoryIterator::isWritable — 現在の DirectoryIterator アイテムが書き込み可能であるかどうかを調べる
- DirectoryIterator::key — 現在の DirectoryIterator アイテムのキーを返す
- DirectoryIterator::next — 次の DirectoryIterator アイテムに移動する
- DirectoryIterator::rewind — DirectoryIterator を最初に巻き戻す
- DirectoryIterator::seek — DirectoryIterator のアイテムを移動する
- DirectoryIterator::__toString — ファイル名を文字列として取得する
- DirectoryIterator::valid — 現在の DirectoryIterator の位置が有効なファイルであるかどうかチェックする
Kunal Bhatia->kmasterzone@gmail dot com
15-Apr-2011 02:48
red_indian hotmail com
13-Apr-2010 12:36
Note that seek() and count() are not always available. At least not on ZendServer CE with PHP 5.2.12 on Mac OSX.
Simple test:
<?php
echo "php ".phpversion().": ";
$dirit = new DirectoryIterator( '.' );
var_dump( method_exists( $dirit, 'seek' ) );
var_dump( method_exists( $dirit, 'count' ) );
?>
You can implement them using existing methods:
seek(): rewind() and then $pos times next()
count(): clone iterator (to keep position), rewind() and then ++$count while ( valid() )
krystianmularczyk at gmail dot com
25-Jan-2009 03:31
Shows us all files and catalogues in directory except "." and "..".
<?php
foreach (new DirectoryIterator('../moodle') as $fileInfo) {
if($fileInfo->isDot()) continue;
echo $fileInfo->getFilename() . "<br>\n";
}
?>
David Lanstein
21-Jan-2009 12:50
DirectoryIterator::getBasename() has been also been available since 5.2.2, according to the changelog (not documented yet). It takes a parameter $suffix, and is useful if, for instance, you use a naming convention for your files (e.g. ClassName.php).
The following code uses this to add recursively All*Tests.php in any subdirectory off of tests/, basically, suites of suites.
<?php
// PHPUnit boilerplate code goes here
class AllTests {
public static function main() {
$parameters = array('verbose' => true);
PHPUnit_TextUI_TestRunner::run(self::suite(), $parameters);
}
public static function suite() {
$suite = new PHPUnit_Framework_TestSuite('AllMyTests'); // this must be something different than the class name, per PHPUnit
$it = new AllTestsFilterIterator(
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator(dirname(__FILE__) . '/tests')));
for ($it->rewind(); $it->valid(); $it->next()) {
require_once($it->current());
$className = $it->current()->getBasename('.php');
$suite->addTest($className::suite());
}
return $suite;
}
}
?>
Also, the AllTestsFilterIterator above extends FilterIterator, and contains one method, accept():
<?php
class AllTestsFilterIterator extends FilterIterator {
public function accept() {
if (preg_match('/All.*Tests\.php/', $this->current())) {
return true;
} else {
return false;
}
}
}
?>
Mark van Straten
09-Jul-2008 07:56
Implements Iterator so you can foreach() over the content of the given directory
