現在の位置: ホーム> 最新記事一覧> Scandirを介して、ディレクトリとそれらの対応するファイルにシンボリックリンクをリストする方法は?

Scandirを介して、ディレクトリとそれらの対応するファイルにシンボリックリンクをリストする方法は?

gitbox 2025-09-09

PHPでは、 Scandir関数は、指定されたディレクトリにすべてのファイルとサブディレクトリをリストできます。ただし、 Scandirはファイルとディレクトリの簡単なリストのみを返し、シンボリックリンクを区別しません。ディレクトリ内のシンボリックリンクと彼らが指すターゲットファイルをリストするには、 ScandirIS_LinkおよびReadLink関数を処理に使用する必要があります。

1。Scandir基本的な使用

Scandir関数は、指定されたディレクトリ内のすべてのファイルとサブディレクトリを返し、デフォルトでアルファベット順に配置されます。基本的な使用法は次のとおりです。

 <span><span><span class="hljs-variable">$files</span></span><span> = </span><span><span class="hljs-title function_ invoke__">scandir</span></span><span>(</span><span><span class="hljs-variable">$directory</span></span><span>);
</span></span>

$ディレクトリパラメーターはスキャンするターゲットディレクトリであり、返される値は、そのディレクトリ内のすべてのファイルとサブディレクトリを含む配列です。 Scandirによって返されたリストにはSpecialが含まれていることに注意してくださいおよび..それぞれ現在のディレクトリと親ディレクトリを表すアイテム。

2。シンボリックリンクを除外します

ファイルまたはディレクトリがシンボリックリンクであるかどうかを判断するには、PHPのIS_LINK関数を使用できます。特定のパスがシンボリックリンクであるかどうかを確認します。

 <span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_link</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> それは象徴的なリンクです\n";
}
</span></span>

3。シンボリックリンクによって指摘されたターゲットを取得します

ReadLink関数を使用して、シンボリックリンクがポイントする実際のファイルパスを取得します。指定されたパスがシンボリックリンクである場合、 ReadLinkはシンボリックリンクのターゲットパスを返します。それ以外の場合は、 falseを返します。

 <span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_link</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>)) {
    </span><span><span class="hljs-variable">$target</span></span><span> = </span><span><span class="hljs-title function_ invoke__">readlink</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> 指向 </span><span><span class="hljs-subst">$target</span></span><span>\n";
}
</span></span>

4。完了コードの例:ディレクトリとそれらに対応するファイルのシンボリックリンクをリストします

上記のコードを組み合わせて、指定されたディレクトリにシンボリックリンクとそのターゲットファイルをリストできます。

 <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-variable">$directory</span></span><span> = </span><span><span class="hljs-string">'/path/to/directory'</span></span><span>;

</span><span><span class="hljs-comment">// 使用 scandir ディレクトリリストを取得します</span></span><span>
</span><span><span class="hljs-variable">$files</span></span><span> = </span><span><span class="hljs-title function_ invoke__">scandir</span></span><span>(</span><span><span class="hljs-variable">$directory</span></span><span>);

</span><span><span class="hljs-comment">// トラバースディレクトリリスト</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$files</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$file</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">$file</span></span><span> === </span><span><span class="hljs-string">'.'</span></span><span> || </span><span><span class="hljs-variable">$file</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-comment">// 完全なファイルパスのスプライシング</span></span><span>
    </span><span><span class="hljs-variable">$filePath</span></span><span> = </span><span><span class="hljs-variable">$directory</span></span><span> . DIRECTORY_SEPARATOR . </span><span><span class="hljs-variable">$file</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__">is_link</span></span><span>(</span><span><span class="hljs-variable">$filePath</span></span><span>)) {
        </span><span><span class="hljs-comment">// シンボリックリンクによって指されたターゲットファイルを取得します</span></span><span>
        </span><span><span class="hljs-variable">$target</span></span><span> = </span><span><span class="hljs-title function_ invoke__">readlink</span></span><span>(</span><span><span class="hljs-variable">$filePath</span></span><span>);
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$file</span></span></span><span> それは象徴的なリンクです,指向 </span><span><span class="hljs-subst">$target</span></span><span>\n";
    }
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

5。コード解析

  • Scandir($ Directory) :ディレクトリ内のすべてのファイルとサブディレクトリを取得します。

  • is_link($ filepath) :現在のファイルがシンボリックリンクであるかどうかを判断します。

  • readLink($ filepath) :シンボリックリンクがポイントするファイルパスを取得します。

6.サンプル出力

ディレクトリ/パス/to/ディレクトリに次のコンテンツがあると仮定します。

  • file1.txt (通常のファイル)

  • symlink1/path/to/target1.txtへのsymlink)

  • symlink2/path/to/target2.txtへのsymlink)

上記のコードを実行した後、出力は次のとおりです。

 <span><span>symlink1 それは象徴的なリンクです,指向 /</span><span><span class="hljs-type">path</span></span><span>/</span><span><span class="hljs-keyword">to</span></span><span>/target1.txt
symlink2 それは象徴的なリンクです,指向 /</span><span><span class="hljs-type">path</span></span><span>/</span><span><span class="hljs-keyword">to</span></span><span>/target2.txt
</span></span>

7。概要

ScandirIS_LinkReadLink関数を組み合わせることにより、指定されたディレクトリとそれらに対応するターゲットファイルのシンボリックリンクを簡単にリストできます。このアプローチは、特に複雑なディレクトリ構造を扱う場合、ファイルシステムのシンボリックリンクをより適切に管理および分析するのに役立ちます。