HP 学習チュートリアルの記事紹介: PHP のディレクトリ トラバーサルに関する詳細なチュートリアル。PHP アプリケーションを作成するプロセスでは、指定されたディレクトリのトラバーサルとファイルのフィルタリングが不可欠であり、ディレクトリの解析と読み取りを行うことが重要です。これらのメソッドをしっかりとマスターすることが、すべての PHP 者に必要なことです
Php でのディレクトリ トラバーサルに関する詳細なチュートリアル
PHP アプリケーションを作成するプロセスでは、指定されたディレクトリの走査とファイルのフィルタリングは避けられず、PHP 自体がディレクトリの解析と読み取りのための強力な方法を提供します。これらのメソッドをしっかりと理解することは、すべての PHPer にとって必須です。この記事では、著者の経験がまだ浅いため、いくつかの重要な方法を要約して説明します。間違いや脱落がある場合は、ネチズンが修正して一緒に進歩できることを願っています。
Function OutのWayの「Sの」の「Out Out Out Out Out Out Out Out Out Sto '' s ' - - - n r r-」と
opendir リソースハンドル 指定したディレクトリのリソースハンドルを取得します
is_dirそれがディレクトリであるかどうかを決定
is_readable Boolean 指定されたディレクトリが読み取り可能かどうか
readdir String リソース ハンドルを通じてファイルのファイル名を読み取り、ファイルが存在しない場合、または末尾にある場合は、ポインタを後方に移動します。 false
を返します。
Closedir void はリソース ハンドルを閉じてリソースを解放します
scandir 配列 指定されたディレクトリ内のすべてのファイルとディレクトリの配列を返します
指定したフォルダー内のファイルを走査します
このコードは、指定されたディレクトリ内のファイルとディレクトリの基本的な走査を完了します。readdir 関数は、指定されたディレクトリ リソース ハンドル $handle 内のファイルを読み取り、最後のファイルに到達した場合は、false を返します。さらに、「.」は現在のディレクトリを表し、「..」は上位ディレクトリを表します。ほとんどの場合、これらを除外する必要があります。
指定されたフォルダー内の指定されたタイプのファイルをスキャンします
ほとんどの場合、ディレクトリの走査は特定の条件によって制限されることがよくあります。たとえば、指定されたディレクトリ内の画像ファイルまたはすべての XML ファイルを走査するだけで済みます。上記の要件を満たすために、コードを書き直し、コードを関数にカプセル化します。この関数は、「.」と「..」およびディレクトリをフィルタリングして、パラメータに基づいて指定された拡張子を持つファイルを返します。
上記の関数は、指定されたディレクトリにある指定された種類のファイルを取得できます。 mypics の下にあるすべての jpeg および png ファイルを取得したい場合は、この関数を呼び出します。
$temp = getFileFrom("./mypics",array('jpeg','png'));
ディレクトリツリーの再帰的走査
PHP で最も実用的な再帰関数は、ディレクトリの再帰的走査だと思います。次の関数は、指定されたディレクトリの完全な構造を取得できます。同時に、コードを簡素化するために、opendir の代わりに scandir が使用されました。
魔法の球体
Globはphp4.3.0以降に追加された非常に強力な機能ですが、残念ながら公式マニュアルには詳しく書かれていません。関数は次のように定義されます:
配列 glob ( string $pattern [, int $flags = 0 ] )
glob には 2 つのパラメータ $pattern とオプションの $flag があります。 $pattern は、単にディレクトリを指定する文字列ではなく、文字通りテンプレートです。$flag は、glob の動作を変更するために使用される定数パラメーターです。
実践を通じてその使い方を学びましょう。コード 1 は、ディレクトリ内のすべてのファイルを走査するために使用されるコードです。これは、glob で記述されている場合に実行できます。
違いがわかります。第 1 に、glob ははるかに単純です。第 2 に、glob の最初のパラメータ「d:/wamp/*」は、検索対象のファイルが「d:/wamp」ディレクトリ内のすべてのファイルであることを glob に指示します。したがって、$pattern はオペレーティング システムのワイルドカード文字に近いことがわかります。さらに、返されたコンテンツから「.」と「..」が除外されています。すべての bmp ファイルを検索したい場合は、パラメーターを「d:/wamp/*.bmp」として記述するだけで十分です。今はもっとシンプルです。一般的な例を挙げると、たとえば、Web サイトの下に、wallpaper というフォルダーがあり、以下の各ディレクトリが壁紙のカテゴリであり、各カテゴリには、origin (通常のサイズ) と、thumb (サムネイル) の 2 つのディレクトリが含まれています。すべてのカテゴリのすべてのサムネイルを読み取るにはコードが必要です。glob を使用しない場合、コードは次のようになります。
foreach(glob("wallpaper/*/thumb/*") as $fileName){
ehco $fileName;
}
glob の 2 番目のパラメータの意味:
GLOB_MARK 各ディレクトリにバックスラッシュ
を追加します
GLOB_NOSORT 結果はソートされていません
GLOB_NOCHECK 一致する結果がない場合は、テンプレート自体を返します
GLOB_NOSPACE バックスラッシュはメタキャラクターを引用しません
GLOB_BRACE {a,b,c} は a,b,c に分解され、それぞれ照合されます (重要)
GLOB_ONLYDIR ディレクトリのみに戻ります
GLOB_ERR 読み取りエラー (読み取り不能なディレクトリなど) で停止します。デフォルトではエラーは無視されます。
画像のファイルを見つけたい場合は、次のように記述できます
foreach(glob("d:/wamp/{*.jpeg,*.jpg,*.gif}", GLOB_BRACE) as $filename){
エコー $ファイル名
}
次のコードは getFileFrom() 関数を応用したもので、$exts パラメータの解析がより簡単になります。
以上、個人的な勉強メモともいえるディレクトリトラバースについて簡単にまとめましたが、皆様のお役に立てれば幸いです。