PHP でディスク カタログ アプリケーションを作成しています。私のスクリプトはディレクトリをループし、すべてのファイル名とメタデータをデータベースに保存します。下に移動したくない特定のディレクトリがあります。イテレータは、これらのディレクトリの名前をファイルであるかのように単純に返し、次の兄弟に移動する必要があります。一致するファイル名パターンに基づいてディレクトリを省略できるようにする RecursiveCallbackFilterIterator を実装しました。
$filter = array(".app");
$files = new RecursiveIteratorIterator(
new RecursiveCallbackFilterIterator(
new RecursiveDirectoryIterator(
$zpath,
RecursiveDirectoryIterator::SKIP_DOTS
),
function ($current, $key, $iterator) use ($filter) {
$match = 0;
foreach ($filter as $skip) {
if (substr($current->getBaseName(), -4, 4) == $skip) {
$match = 1;
}
}
if ($match) {
return false;
} else {
return true;
}
}
),
RecursiveIteratorIterator::SELF_FIRST,
RecursiveIteratorIterator::CATCH_GET_CHILD
);
foreach ($files as $splFileInfo) {
$path = $splFileInfo->getRealPath();
echo $path."\n";
}
私の質問は、パターンに一致するディレクトリが結果セットに含まれるようにこのコードを変更するにはどうすればよいですか?
これまでのところ、私が見つけた RecursiveCallbackFilterIterator のすべての例は、上記のいくつかのバリエーションを示しています (たとえば、特定のファイルやディレクトリを省略しています)。パターンに一致する場合はディレクトリ名を返し、次の兄弟に移動したいだけです。
言い換えれば、私はこれを変える必要があります:
File1.txt
File2.txt
Folder1/
Folder1/FileA.txt
Folder1/FileB.txt
MyThing.app/
MyThing.app/Contents/
Mything.app/Contents/Manifest.plist
Mything.app/Menu.nib
Portfolio.zip
Zee.txt
これに:
File1.txt
File2.txt
Folder1/
Folder1/FileA.txt
Folder1/FileB.txt
MyThing.app
Portfolio.zip
Zee.txt