【Java】Path normalize()メソッド 階層構造を辿る

EngineeringJava, 備忘録, 職業訓練

Path normalize()メソッド

・例題 Path n = Paths.get(“C:\foo\..\bar\..\.\.\a.txt”); が normalize して、なぜ C:\a.txt となるのかがわからない

白本の問題で、解説を読むもののどうにも、1)と2)の「\\.」と「\\..」の意味がわからないよ〜。

結局どういう理由で、解答のフォルダを示すことになるのかな?

 

1) p231 ”C:\\gold\\..\\info\\test\\.\\..\\sample.txt”

2) p389 ”C:\\gold\\.\\info\\.\\..\\test.txt”

 

 

「java normalize 階層構造」、続いて「java normalize 冗長部分の削除」で検索したところ、以下のような記述があって読んだよ。

「.\や..\とかかれていた場合に、それらを省略」「”.”や”ディレクトリ名/..”などの冗長な要素が削除されます。」「パスの冗長部分を削除する際にファイル・システムの実際の状況が確認されるわけではないことに注意してください。 これは純粋な統語処理です。 上の2つ目のパスでsallyがシンボリック・リンクの場合、sally/..を削除すると、Pathが目的のファイルの場所を示さなくなる可能性があります。 」

 

う〜ん、どうもはっきりしないため、最強の参考書といわれる https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Path.html#normalize– を見ると、

このパスから冗長な名前要素を削除したパスを返します。
このメソッドの正確な定義は実装に依存しますが、通常、それはこのパス(冗長な名前要素を含まないパス)から派生しています。多くのファイル・システムでは、「.」および「..」は現在のディレクトリおよび親ディレクトリを示すために使われる特殊な名前です。そのようなファイル・システムでは、「.」のオカレンスはすべて冗長とみなされます。「..」の直前に「..」以外の名前が存在する場合、その両方の名前が冗長とみなされます(そのような名前を識別するプロセスが該当しなくなるまで繰り返される)。
このメソッドはファイル・システムにアクセスしません。つまり、そのパスは存在しているファイルを検出しない可能性があります。「..」とそれに先行する名前をパスから削除すると、元のパスとは異なるファイルを検出するパスが生じる可能性があります。これは、先行する名前がシンボリック・リンクの場合に発生することがあります。

さすが日本語の情報群。わからんデス。

 

 

解消

(「¥¥」≒「\\」 depends on OS) 職業訓練の講師に質問して回答を得たよ。

・「\\.」 そのディレクトリ自身を指すよ。

・「\\..」 親のディレクトリを指すよ。

・「\」、「¥」、「」 ルートを指すよ。

 

・”C:\\gold\\..\\info\\test\\.\\..\\sample.txt” にせよ ”C:\\gold\\.\\info\\.\\..\\test.txt” にせよ、
右から読んでいくと「\\.\\..」のところで意味がわからなくなるので、左から読むとして、
「\.」はなくても機能的に問題ないと思うんだけど。
必要な理由をこじつけるとしたら、「\\.\\..」における親 \\.. は、直前の \\. の経路の親を指すしるし、ということになるかな。ちがうかな?

Java_normalize

 

 

 


EngineeringJava, 備忘録, 職業訓練

Posted by Qawai