2013-01-03 28 views
0

我的Java程序正在啓動另一個進程並將文件的絕對路徑作爲命令行參數傳遞。該路徑可能包含空格。所以我在將它添加到參數之前引用了路徑。當路徑中出現雙引號時,我使用\將其轉義出來。作爲參數傳遞時轉義文件名

下面是代碼:

private String escapeQuotes(String original) { 
    StringBuilder builder = new StringBuilder(); 
    for (int i = 0; i < original.length(); i++) { 
     if (original.charAt(i) == '"') { 
      builder.append('\\'); 
     } 
     builder.append(original.charAt(i)); 
    } 
    return builder.toString(); 
} 

我使用它像,

String args = " \"" + escapeQuotes(filePath) + "\""; 

這種運作良好。但我想知道這種方法是否可靠?或者還有什麼我應該像我逃脫雙引號的方式來處理?

任何幫助將是巨大的!

+0

你在爲哪個環境構建這個應用程序?至少在Windows上,文件名不能包含雙引號,因此不需要轉義它們。 –

+1

我不認爲這是愚蠢的證據。在他們已經逃脫的情況下,你可以逃避它們。也許使用正則表達式呢? – jlordo

+0

@jlordo我不會在這裏獲得轉義的文件路徑。 –

回答

1

我不認爲你需要做到這一點,如

Runtime.getRuntime().exec(new String[] {"cmd", "/c", "dir", "d:/test ;test"}) 

工作正常,請注意,「F:/測試;測試」包含機器人'和「;」

1

你如何啓動其他過程?如果您使用的是version of Runtime.exec that takes an array,則無需在任何參數中轉義空格。

例如

Runtime.getRuntime().exec(new String[] { "notepad.exe", 
    "c:\path with spaces\afile.txt" }); 
+0

我正在從Eclipse JDT的'JavaLaunchDelegate'的子類中執行此操作。 –

1

按下後我的評論:恕我直言,該方法不傻瓜證明,因爲它也將逃脫已經轉義的引號。我會用:

private String escapeQuotes(String original) { 
    return original.replaceAll("(?<!\\\\)\"", "\\\\\""); 
} 

然後

System.out.println(escapeQuotes("Not escaped\", escaped\\\"")); 

打印

Not escaped\", escaped\"

在控制檯

,而你的版本將打印

Not escaped\", escaped\\"