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


12

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

現在、私たちが独自に作成したユーティリティライブラリには、すべてのバックスラッシュをスラッシュに単純に置き換えるメソッドが用意されています。

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

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


4
スペースに注意してください-Windowsフォルダー名にスペースを入れることは、UNIXディレクトリー名よりもはるかに一般的です。特に、「\ Program Files」は常に私を魅了します。パスの使用方法によっては、「\」でスペースをエスケープする必要がある場合があります。
ロブ14年

1
@delnanを簡単にするために、変数パスを除外するためにパスのスコープを制限しましょう。
MxLDevs 14年

2
@MxyL環境変数を使用する代わりにパスをハードコーディングしても、問題は解決しません。爆発しないパスが必要な場合は、問題ないはずです。意味のあるパスが必要な場合、または他のソフトウェアと対話する場合(またはユーザーの期待...)、パスごとの判断呼び出しが必要です。

1
@delnan私は主に有効なパスを作成することに焦点を当てていますが、それは良い点です。私が変換しているパスは、それ自体で意味があるほど単純でなければなりません。
MxLDevs 14年

3
Linuxではファイル名にバックスラッシュを使用できるため、Linuxパスのバックスラッシュを置き換えると無効なディレクトリが追加される可能性があります。たとえば、Linux上/foo\\barと同等ではありません/foo/bar

回答:


7

はい、 あればあなただけの交換を行うWindows上での、および他のシステム上で動作しているときにそれをオフにします。

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

また、一部のWindows API関数(主に下位レベルの関数)では、スラッシュの使用が許可されいません。これらの関数ではバックスラッシュを使用する必要があります。


4

はい、しかし、この全体が重要なポイントです。Javaは、Windows上でスラッシュをバックスラッシュにシームレスに変換します。ハードコードされているか、構成に保存されているすべてのパスに単にスラッシュを使用することができ、両方のプラットフォームで機能します。

個人的には、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!");
}

1
私の答え全体を読めば、Unixファイル区切り文字を常に使用すると、両方の場所で正しく機能し、変換は不要であると私は言うことがわかります。

質問は、ファイルが転送されることを示しており、ファイル名の保存方法は公開されたままです。その点に関する説明を求める質問にコメントを追加しました。回答に基づいて、必要に応じて回答を編集します。

プログラムが実際にその中に、転送されるすべてのファイルの手動で入力されたリストを含むことはほとんどありません。ファイルを列挙するために何らかの自動化メカニズムが使用されている可能性が非常に高いです。問題のパラメータが質問で述べられているように、このメカニズムは従来のWindowsスタイルのパスを提供します。現在の形では、この答えは、どのように、あるいはそれらを伝えることなく、代わりに別の問題を解決するためにOPを語っていることを、彼らは別の問題に彼らを変換する必要があります。
エリアケイガン14

以前のコメントを読んでください。

1
Windowsはフォワードとバックスラッシュの両方を認識し、初期のMS-DOS以来その方法でした。つまり、すべてのMicrosoft OSカーネルには、スラッシュ区切り記号のサポートがあります。初期のCOMMAND.COMインタプリタには実行時の設定がありました。インタプリタが印刷と解析に使用するスラッシュを設定できます。
カズ

3

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

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


1
これは、これまでに引用された唯一の懸念事項であり、実際にこのアプリケーションの問題であると思います。関連するUNCパスがある場合、それら Unixスタイルのパスに有効に変換することはできません
ジュール

2

いいえ。 パスセパレーター( "\ vs /"のこと)だけでなく、考えることははるかに多くあります。Rob Yが述べているように、スペースの処理方法と、Windowsの使用頻度が高いことがあります。2つの環境には異なる違法文字があります。先行する「\」でエスケープされた場合、ほとんどすべてを許可するUnixの意思があります。Windowsは埋め込みスペースを処理するために「」を使用します。WindowsはUCS-16を使用し、UnixはASCIIまたはUTF-8を使用します。

などなどなど

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


1
これらの懸念は提起された質問に対して有効ではないと思います。スペース処理はユーザーインターフェイスの問題です。Unixシステム、Windowsと同様にファイル名のスペースを処理できます。Windowsの不正な文字は、Unixの文字のスーパーセットです。Windowsファイル名にバックスラッシュを含めることはできません(変換されるディレクトリセパレーター以外)。埋め込みスペースに引用符を使用することは、ファイル処理の問題ではなく、ユーザーインターフェイスレベルの問題です。変換コードは明らかにJavaであるため、UCS16-> UTF8変換を自動的に処理する必要があります。
ジュール

-1

MS-DOSから始まるすべてのMicrosoftオペレーティングシステムは、カーネルレベルでスラッシュとバックスラッシュの両方を理解しています

したがって、Windowsでは、それらの間で自由に変換できます。どちらも予約済みのセパレーターと同じステータスを持っています。任意の有効なパスで、カーネルに関する限り、その意味を変更せずに、バックスラッシュをスラッシュに、またはその逆に置き換えることができます。

DOSの初期のバージョンでは、Microsoftのcommand.comインタープリターにより、パスを表示および解析するためにスラッシュが使用される構成可能な設定が行われました。それは最終的に削除されました。

Windowsシェル(explorer.exe)などのWindowsの一部のユーザー空間プログラムは、スラッシュが好きではありません。それは、これらのプログラムでの見苦しいプログラミングです。


1
これは事実ですが、OPの質問(AIUI)には既存のパス名の変換が含まれていて、そのパス名には既にバックスラッシュが含まれていたと思われます。クロスプラットフォームコードを記述するのに非常に役立ちます。これは、スラッシュを使用するだけでほとんどのコンテキストで使用できることを理解するためですが、この場合役に立たないと思います。
ジュール

@Jules OPはWindowsからファイルを転送しています。この答えは、置き換えられるバックスラッシュがないことを説明しています。Windowsファイルシステム自体にはまったくありません。すべてのパスはスラッシュで表現できます(Windowsでも理解できます)。
カズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.