-6

現在のディレクトリのコンテンツリストを含むxmlファイルを各ディレクトリに追加しながら、フォルダーとそのサブディレクトリに再帰的に実行する方法は?

私はそのようなことを試しました:

$dir = new DirectoryIterator($folder);
foreach ($dir as $fileinfo) {
    $fd=fopen('index.xml','wb');
    if (!$fileinfo->isDot() && !is_dir($fileinfo)) {
        fwrite($fd,'Something');
    }
}

編集 :

スクリプトはこれを行う必要があります:

ディレクトリを開き、ここに存在するファイルのリストを使用してここに xml ファイルを作成します (ディレクトリではない) 次に、次のディレクトリを開き、ここに存在するファイルのリストを使用してここに xml ファイルを作成します (ディレクトリではない) など...

4

1 に答える 1

1

ディレクトリ構造のフラットな繰り返しが必要な場合は、 RecursiveIteratorIterator によって駆動される RecursiveDirectoryIterator を組み合わせてください。これは、反復のスケルトンがどのように見えるかです:

$start_dir =  '/some/path';
$rit = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator(
        $start_dir,
        FilesystemIterator::KEY_AS_PATHNAME |
        FilesystemIterator::CURRENT_AS_FILEINFO |
        FilesystemIterator::SKIP_DOTS
    ),
    RecursiveIteratorIterator::SELF_FIRST
);

foreach ($rit as $path => $fileinfo) {
    $level = $rit->getDepth();
    if ($fileinfo->isDir()) {
        print "[{$level}] in dir:{$path}\n";
    } else {
        print "[{$level}] file: {$path}\n";
    }
}

これは少し恐ろしく見えるかもしれませんが、実際には比較的単純です。

  1. が大部分のRecursiveDirectoryIterator作業を行いますが、それを繰り返すと、 aa simple で得られるように、選択したディレクトリのノードが得られますDirectoryIterator

  2. ただし、インターフェイスを実装しているため、ループ内の「has child? recurse into ...」条件を使用しRecursiveIteratorて駆動し、保存できます。これが、フラットに見えるイテレータを返しますが、実際には子ノードに再帰します。を使用して、リーフ ノードのサブ反復がいつ開始されるかを検出できます。また、フル パス名を使用して、ディレクトリがどのように変化しているかを検出できます。RecursiveIteratorIteratorRecursiveIteratorIteratorgetDepth

于 2013-06-27T07:36:23.940 に答える