4

Java 7 の新しい Path オブジェクトを使用していますが、問題が発生しています。

ベース ディレクトリを持つファイル ストレージ システムがあり、独自の相対パスを作成しています。最後に、この相対パスだけをどこかに保存したいと思います。私は Path.relativize で問題に遭遇しています。

私には2つのユースケースがあります。1.

Path baseDir = Paths.get("uploads");
Path filename = Paths.get("uploads/image/test.png")

return baseDir.relativize(filename);

image/test.pngこれは完璧なPath を返します。

ただし、ユースケース 2:

Path baseDir = Paths.get("uploads");
Path filename = Paths.get("image/test.png")

return baseDir.relativize(filename);

戻ります../image/test.png。「image/test.png」を返したいだけです

パスのチュートリアルでは、

他の情報がない場合、2 つのパスは兄弟であると見なされます。

私が欲しいのは、これが事実であることを検出できるようにすることです。この場合、ファイル名だけを返し、baseDir を無視します。

私は現在このように解決していますが、もっと良い方法があることを望んでいました:

Path rootEnding = getRootDirectory().getName(getRootDirectory().getNameCount() - 1);

for (Path part : path) {
    if (part.equals(rootEnding)) {
        return getRootDirectory().relativize(path);
    }
}

return path;

私の質問は、これを確認するより良い方法はありますか?

4

2 に答える 2

1

normalize()afterを追加してみてくださいrelativize()。まさにこれを行うことを意図しているようです(不要な .. および . を削除します)。javadoc のシンボリック リンクに関する注意事項をお見逃しなく。

于 2012-10-09T11:25:06.173 に答える
0

これはあなたが上に書いたものと 100% 同等ではありませんが、あなたが望むことはできると思います。基本的にbaseDirは相対パスにしましょう。相対的なものは何でもbaseDirファイルシステムのルートであると仮定します。filename次に、この「シミュレートされたルート」からの相対または絶対のいずれかを許可します。

どうですか:

if (filename.startsWith(baseDir)) {
    filename = baseDir.relativize(filename);
}
于 2012-10-09T13:05:16.303 に答える