web-dev-qa-db-ja.com

単純な置換でWindowsファイルパスをUnixファイルパスに変換しても安全ですか?

たとえば、自分のファイルがすべてWindowsマシンからUNIXマシンに転送されるように、たとえばC:\test\myFile.txtから{somewhere}/test/myFile.txt(この時点ではドライブ文字は関係ありません)。

現在、私たちが独自に作成したユーティリティライブラリは、すべてのバックスラッシュをフォワードスラッシュで簡単に置き換えるメソッドを提供しています。

public String normalizePath(String path) {
   return path.replaceAll("\\", "/");
}

スラッシュは予約されており、ファイル名の一部にすることはできないため、ディレクトリ構造を保持する必要があります。しかし、私が心配する必要があるかもしれないウィンドウとUNIXパスの間に他の複雑な問題があるかどうかはわかりません(例:非ASCII名など)。

12
MxLDevs

はい、 if交換のみを行う windowsでは 他のシステムで実行している場合はオフにします。

Unixライクなシステムで置換を行うのは 違う \は unixライクなプラットフォームのファイル名またはディレクトリ名の有効な文字。 これらのプラットフォームでは、NUL/のみがファイル名とディレクトリ名で禁止されています。

また、一部のWindows API関数(主に下位レベルの関数) 許可しない スラッシュの使用-バックスラッシュ しなければならない それらと一緒に使用されます。

7
Demi

はい、しかし、これはすべての問題点です。 Java Windowsではスラッシュをバックスラッシュにシームレスに変換します。ハードコーディングされているか、構成に保存されているすべてのパスにスラッシュを使用するだけで、両方のプラットフォームで機能します。

個人的には、スラッシュはnotエスケープ文字であるため、Windowsでも常にスラッシュを使用します。生のパスがコード内にあるか、プロパティファイルに外部化されているかに関係なく、私は同じ方法でエンコードします。

それを試してみてください!これはWindowsで動作します。明らかに、実際のパスを存在するものに変更し、ユーザーには読み取り権限があります。

File f = new File("c:/some/path/file.txt");
if (!f.canRead()) {
  System.out.println("Uh oh, Snowman was wrong!");
}

おまけ:スラッシュを混ぜることもできます同じパスで!

File f = new File("c:/some\\path/file.txt");
if (!f.canRead()) {
  System.out.println("Uh oh, Snowman was wrong again!");
}
4
user22815

Windowsでのもう1つの問題は、従来のドライブ文字だけでなくUNC表記もサポートしていることです。

リモートファイルサーバー上のファイルには、\\server\sharename\path\filenameとしてアクセスできます。

3
Simon B

No。単なるパスの区切り記号( "\ vs /"のこと)以外にも、考えなければならないことがたくさんあります。 Rob Yが述べているように、スペースの処理方法と、Windowsでの使用頻度の高さがあります。 2つの環境に異なる違法な文字があります。先頭に「\」を付けてエスケープすると、ほとんどすべてを許可するというUnixの意欲があります。埋め込みスペースを処理するためにWindowsで「 "」が使用されています。WindowsではUCS-16が使用されており、UnixではASCIIまたはUTF-8が使用されています。

etc。etc。など

しかし、操作する必要のあるパス名に制約を課すことができる多くのアプリケーションでは、実際にあなたが提案する方法でそれを行うことができます。そして、それはすべてのケースではなく、少なくとも多くのケースで機能します。

2
Ross Patterson