現在の位置: ホーム> 最新記事一覧> chdir()、opendir()、およびreaddir()を組み合わせてディレクトリトラバーサルを実装する実用的な例

chdir()、opendir()、およびreaddir()を組み合わせてディレクトリトラバーサルを実装する実用的な例

gitbox 2025-09-09
<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// コードのこの部分は、記事の内容とは何の関係もありません,例を挙げてください</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"PHP ディレクトリトラバーサルの例が開始されます&lt;br&gt;"</span></span><span>;
</span><span><span class="hljs-meta">?&gt;</span></span><span>

&lt;hr&gt;

</span><span><span class="hljs-meta">&lt;?php</span></span><span>
<span class="hljs-comment">/**
 * 組み合わせた chdir()、opendir() そして readdir() ディレクトリトラバーサルの実装の実用的な例
 *
 * 存在する PHP 真ん中,操作書類そして目次是常见需求,特に、ディレクトリを通過する必要がある場合。
 * chdir() 現在の作業ディレクトリを変更できます,opendir() ディレクトリハンドルを開くために使用されます,
 * readdir() 用于逐个读取目次真ん中的書類或子目次。
 *
 * この記事には例が渡されます,演示如何組み合わせた这三个函数实现目次的遍历。
 */</span>

</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">traverseDir</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$path</span></span></span><span>) {
    </span><span><span class="hljs-comment">// 最初に作業ディレクトリを変更してみてください</span></span><span>
    </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">chdir</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>)) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ディレクトリに切り替えることができません:<span class="hljs-subst">$path</span></span></span><span>&lt;br&gt;";
        </span><span><span class="hljs-keyword">return</span></span><span>;
    }
    
    </span><span><span class="hljs-comment">// 現在のディレクトリを開きます</span></span><span>
    </span><span><span class="hljs-variable">$handle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">opendir</span></span><span>(</span><span><span class="hljs-string">'.'</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$handle</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ディレクトリハンドルを開くことができません&lt;br&gt;"</span></span><span>;
        </span><span><span class="hljs-keyword">return</span></span><span>;
    }
    
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"現在のディレクトリ: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">getcwd</span></span><span>() . </span><span><span class="hljs-string">"&lt;br&gt;"</span></span><span>;
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ディレクトリの内容は次のとおりです:&lt;br&gt;"</span></span><span>;
    
    </span><span><span class="hljs-comment">// 遍历目次真ん中的書類そして書類夹</span></span><span>
    </span><span><span class="hljs-keyword">while</span></span><span> ((</span><span><span class="hljs-variable">$entry</span></span><span> = </span><span><span class="hljs-title function_ invoke__">readdir</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>)) !== </span><span><span class="hljs-literal">false</span></span><span>) {
        </span><span><span class="hljs-comment">// 特別ディレクトリを無視します . そして ..</span></span><span>
        </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$entry</span></span><span> === </span><span><span class="hljs-string">'.'</span></span><span> || </span><span><span class="hljs-variable">$entry</span></span><span> === </span><span><span class="hljs-string">'..'</span></span><span>) {
            </span><span><span class="hljs-keyword">continue</span></span><span>;
        }
        
        </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_dir</span></span><span>(</span><span><span class="hljs-variable">$entry</span></span><span>)) {
            </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"[目次] <span class="hljs-subst">$entry</span></span></span><span>&lt;br&gt;";
        } </span><span><span class="hljs-keyword">else</span></span><span> {
            </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"[書類] <span class="hljs-subst">$entry</span></span></span><span>&lt;br&gt;";
        }
    }
    
    </span><span><span class="hljs-title function_ invoke__">closedir</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>);
}

</span><span><span class="hljs-comment">// サンプルコール:あると仮定します test_dir 目次</span></span><span>
</span><span><span class="hljs-variable">$testPath</span></span><span> = </span><span><span class="hljs-string">'test_dir'</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">traverseDir</span></span><span>(</span><span><span class="hljs-variable">$testPath</span></span><span>);
</span></span>