20060109#p1 - 青空迷子

RecursiveDirectoryIterator の使い方を完全に間違えてました。
環境によっては古い間違ったコードでも期待通りの動作をするんだけど、それはたぶんバグ。

--- gather.php.old
+++ gather.php
@@ -4,7 +4,7 @@
  */
 //define('AOZR_DIR', '/Volumes/青空文庫/作家別テキストファイル');
 define('AOZR_DIR', dirname(__FILE__) . '/archives');
-define('AOZR_RE1', '^[\\x{3040}-\\x{309F}]+?・|(\\d+)$');
+define('AOZR_RE1', '^[\\w\\x{3040}-\\x{309F}]+?・|(\\d+)$');
 define('AOZR_RE2','\\.txt$');
 define('NFDKANA_RE', '/([うか-こさ-そた-とは-ほウカ-コサ-ソタ-トハ-ホゝヽ])\\x{3099}|([は-ほハ-ホ])\\x{309A}/u');
 define('EST_DB', 'casket');
@@ -13,14 +13,14 @@
 /**
  * ディレクトリを走査し、パス・著者・作品名をTSVで標準出力に書き出す
  */
-$dir = new RecursiveDirectoryIterator(AOZR_DIR);
-foreach ($dir as $author) {
-    $name = $author->getFilename();
-    if (!$author->isDot() && $author->isDir() && $author->hasChildren()) {
+$flags = RecursiveDirectoryIterator::NEW_CURRENT_AND_KEY;
+$dir1 = new RecursiveDirectoryIterator(AOZR_DIR, $flags);
+foreach ($dir1 as $name => $author) {
+    if (!$dir1->isDot() && $dir1->isDir() && $dir1->hasChildren()) {
         $name = mb_ereg_replace(AOZR_RE1, '', NFD2NFC($name));
-        foreach ($author->getChildren() as $work) {
-            $title = $work->getFilename();
-            if (!$work->isDot() && $work->isFile() && $title != '.DS_Store') {
+        $dir2 = $dir1->getChildren();
+        foreach ($dir2 as $title => $work) {
+            if (!$dir2->isDot() && $dir2->isFile() && $title != '.DS_Store') {
                 $title = mb_ereg_replace(AOZR_RE2, '', NFD2NFC($title));
                 fwrite(STDOUT, sprintf("%s\t%s\t%s\n", $work->getPathname(), $name, $title));
             }

02/03 追記:

fwrite(STDOUT, sprintf("%s\t%s\t%s\n", $work->getPathname(), $name, $title));

の代わりに

fprintf(STDOUT, "%s\t%s\t%s\n", $work->getPathname(), $name, $title);

という方法もあり、たぶんこっちのほうが効率が良い。
ちなみに STDOUT 定数は fopen('php://stdout', 'wb'); と等価のストリームリソース。