【ぱすのせいきか】

パスの正規化 とは?

最終更新:
💡 ファイルへの道順を、決まった書き方に整える

ファイルパスの区切りや「.」「..」などを、OSやAPIの規則に従って整理する処理。表記を整えるだけでは、ファイルの存在やアクセスの許可までは確認できません。

📌 このページのポイント
ファイルへの道順の表記を整理する Node.js:path.posix.normalize の例 docs//draft/.././a.txt 表記を整理 docs/a.txt docs draft draft へ1段進む .. で1段戻る 差し引き0段 結果は相対パスのまま 実ファイル・リンク先・許可は別に確認
Node.jsの文字列の整理を示す例。シンボリックリンクや実ファイルの確認、アクセス許可の判定を代わりに行う処理ではない。
ひよこ ひよこ
ペンギン先生、ファイルの道順を整理するってどういうこと?
ペンギン先生 ペンギン先生
パスに含まれる余分な区切りやドット要素を、決まった規則で整えることだよ。ここでの処理は、データベースの表の分割やUnicodeの文字表現の統一とは別なんだ。
ひよこ ひよこ
具体的にはどんなふうに変わるの?
ペンギン先生 ペンギン先生
Node.jsのpath.posix.normalizeを例にすると、docs//draft/.././a.txt は docs/a.txt になるよ。連続する区切りをまとめ、今の場所を表す . を取り除き、draft と親へ戻る .. を整理する。階層を1つ進んで1つ戻るので、差し引き0段だね。
ひよこ ひよこ
それなら、整理したら絶対パスになるの?
ペンギン先生 ペンギン先生
このNode.jsの例では相対パスのままだよ。一方、Windowsの通常のパスの整理には、相対パスへ現在のディレクトリを補う処理もある。OSやAPIによって範囲が違うので、何を整える機能か確認しよう。
ひよこ ひよこ
表記を整理すれば、読んでもよいファイルになるの?
ペンギン先生 ペンギン先生
それは別の確認だよ。同じNode.jsの処理で /srv/public/../secret.txt を整えると /srv/secret.txt になる。表記は整っていても、許可範囲を /srv/public の中だけと決めたなら外側だね。入力の検証やアクセス制御を、表記の整理だけで済ませてはいけないんだ。
ひよこ ひよこ
同じ場所を指すなら、どのパスも短くしてよさそうなのに…。
ペンギン先生 ペンギン先生
文字だけの整理ではシンボリックリンクの行き先をたどらないよ。途中にリンクがあれば、.. を機械的に消すことで実際の解釈が変わる場合もあるんだ。道順を整える比喩は便利だけど、実ファイルの確認まで終わったと思わないようにしようね。
もっと詳しく知りたい人へ

実際に存在するファイルのリンク先まで調べたいときは?

パス文字列だけの整理とは別に、実ファイルを参照するAPIを使います。Node.jsのfs.realpathは、ドット要素に加えてシンボリックリンクを解決し、存在しないパスにはENOENTエラーを返します。ただしハードリンクなどで同じ実体に複数の名前が付くため、結果が実体ごとに唯一の文字列になるとは限りません。これもアクセス許可の判定を代わりに行う機能ではありません。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「パスの正規化」って出てきたら「ファイルへの道順の表記を、決めた規則で整える処理」と思えばだいたいOK!
📖 おまけ:英語の意味
「Path Normalization」 = 経路表記の正規化
💬 pathは経路、normalizationは一定の形に整えること。ここで扱うのはファイルパスだよ

参考資料

← 用語集にもどる