2012-07-15 6 views
10

WindowsでScalaアプリケーションを開発しています。ファイルへのパスをHTMLテンプレートに挿入する必要があります。私は、Javaのionioを使ってファイルとパスを扱います。アプリケーションは、Windows上で実行されるため - - しかし、パスは、HTMLテンプレートに挿入されるようになるので、それは前進ではなく/をスラッシュ含まれている必要があります特定のパス区切りを持つJavaのFile.toStringまたはPath.toString

/* The paths actually come from the environment. */ 
val includesPath = Paths.get("foo\\inc") 
val destinationPath = Paths.get("bar\\dest") 

/* relativeIncludesPath.toString == "..\\foo\\inc", as expected */ 
val relativeIncludesPath = destinationPath.relativize(includesPath) 

問題はrelativeIncludesPath.toStringの出力は、バックスラッシュ区切りとして\が含まれていることです。

ドキュメントでfile/path.toStringUsingSeparator('/')のようなものが見つからなかったので、私は現在relativeIncludesPath.toString.replace('\\', '/')で自分を助けていますが、それはむしろ魅力的ではありません。

質問:置き換えを使用するよりも良い方法はありませんか?

私もJavaのURIで実験しましたが、relativizeincompleteです。

+0

多分私に何かが不足しています。どうしてあなたはパスを相対化できず、 'toString()'の代わりに 'toURI()'を使うことができませんか? – Gene

+0

私はそれを試しましたが、次に絶対URIを得ました: '' file:/ C:/ root/dir/foo/inc/''。 –

+0

「URI」に言及してくれてありがとう。私はそれが「解決する」ことができるとは気づきませんでした。それは私にとって完璧だということが判明しました。 –

答えて

4

パスインターフェイスのWindowsの実装が内部的に(少なくともOpenJDK implementationで)文字列として単純にパスを格納しますtoString()が呼び出されるとその表現が返されます。これは、計算が含まれず、パス区切りを「構成」する機会がないことを意味します。

この理由から、あなたの解決策は現在、あなたの問題を解決するための最良の選択肢であると結論づけています。

0

システムプロパティのほとんどはJavaで取得できます。このリンクを見てみましょう:

http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html

あなたがこの希望:

Key: "file.separator" 
Meaning: Character that separates components of a file path. This is "/" on UNIX and "\" on Windows. 

String sep = System.getProperty("path.separator"); 
+0

私はセパレータを得ることができることを知っています。私が間違っていなければ、セパレータをグローバルに設定することもできます。しかし、私は、単一の操作または単一のFile/Pathオブジェクトに対して特定の区切り記号を選択する方法を探しています。 –

1

私はこの問題に直面しました。相対パスがある場合は、Pathが要素のIterable<Path>であり、オプションの最初のルート要素の後に続いて、スラッシュで連結することができます。残念ながら、ルート要素にはスラッシュを含めることができます。 Windowsではc:\\\foo\bar\(UNCパス用)のようなルート要素が得られるので、フォワードスラッシュで置き換える必要はありません。しかし、あなたはは...

static public String pathToPortableString(Path p) 
{ 
    StringBuilder sb = new StringBuilder(); 
    boolean first = true; 
    Path root = p.getRoot(); 
    if (root != null) 
    { 
     sb.append(root.toString().replace('\\','/')); 
     /* root elements appear to contain their 
     * own ending separator, so we don't set "first" to false 
     */    
    } 
    for (Path element : p) 
    { 
     if (first) 
      first = false; 
     else 
      sb.append("/"); 
     sb.append(element.toString()); 
    } 
    return sb.toString();   
} 

をこのような何かを行うことができ、私はこのコードでそれをテストするとき:

static public void doit(String rawpath) 
{ 
    File f = new File(rawpath); 
    Path p = f.toPath(); 
    System.out.println("Path: "+p.toString()); 
    System.out.println("  "+pathToPortableString(p)); 
} 

static public void main(String[] args) { 
    doit("\\\\quux\\foo\\bar\\baz.pdf"); 
    doit("c:\\foo\\bar\\baz.pdf"); 
    doit("\\foo\\bar\\baz.pdf"); 
    doit("foo\\bar\\baz.pdf"); 
    doit("bar\\baz.pdf"); 
    doit("bar\\"); 
    doit("bar"); 
} 

私はこれを取得:

Path: \\quux\foo\bar\baz.pdf 
     //quux/foo/bar/baz.pdf 
Path: c:\foo\bar\baz.pdf 
     c:/foo/bar/baz.pdf 
Path: \foo\bar\baz.pdf 
     /foo/bar/baz.pdf 
Path: foo\bar\baz.pdf 
     foo/bar/baz.pdf 
Path: bar\baz.pdf 
     bar/baz.pdf 
Path: bar 
     bar 
Path: bar 
     bar 

のテキスト置換フォワードスラッシュのバックスラッシュは間違いなく簡単ですが、それがいくつかの独創的なケースを壊すかどうかはわかりません。 (Unixのパスにバックスラッシュを入れることはできますか?)

関連する問題