Runtime.getRuntime()。exec()没有打开正确的Windows文件资源管理器

时间:2015-12-16 14:27:55

标签: java windows unicode unicode-normalization

我使用Java的Runtime.getRuntime()。exec(String命令)打开指定文件的Windows文件浏览器。为此我使用命令:

  

explorer pathToOpen

除非路径包含NFD(规范化形式规范化分解)规范化形式中的一些unicode字符,否则它几乎一直有效。

让我举一个例子。我有以下命令:

  

资源管理器C:\ Test \földer

我的本​​地文件系统中包含所有'C盘','测试'和'földer'文件夹。 'földer'以NFD的形式表现出unicode角色'ö'。另外,我确保我传递给exec方法的String也包含与这些文件夹中相同的unicode字符,即以NFD格式。

但这会在我的用户文件夹中打开'Documents'文件夹而不是打开'földer'。如果我创建另一个文件夹,可以说'földerInNFC',其中'ö'是NFC格式,那么如果我执行“explorer C:\ Test \földerInNFC”,则会打开所需的文件夹'földerInNFC'。

我也可以从windows命令提示符中看到相同的结果。我一个接一个地复制并粘贴了两个路径,可以看到相同的行为。 Here is a snippet of my command prompt。此外,我可以看到命令提示符无法识别NFD形式的'ö',但它能够识别NFC形式的'ö'。

Runtime.getRuntime()。exec()和cmd都不支持NFD unicode字符吗?如果没有,那么在java中是否有另一种方法可以为包含NFD形式的unicode字符的特定文件或文件夹打开Windows文件浏览器?

1 个答案:

答案 0 :(得分:0)

您可以使用包含NFD unicode字符的路径名打开Windows资源管理器,如下所示

假设在C:\temp文件夹földer(如果在“FOLDER~1”之后,它看起来很乱,可能与浏览器使用的字体有关)

16/12/2015  15:39    <DIR>          FOLDER~1     földer

要打开的代码段C:\temp\földer(包含NFD unicode字符)

String nfdPath = "fo\u0308lder"; // földer in NFD unicode
File file = new File("c:/temp/" + nfdPath);
// uncomment the next line if you want that folder to be created first
// file.mkdir();
java.awt.Desktop.getDesktop().open(file);

编辑要打开文件夹并选择文件,您可以使用该文件夹的短名称。您可以使用JNA检索该文件夹的短名称。在下面找到第二个问题的简短片段。 ; - )

import com.sun.jna.Native;
import com.sun.jna.platform.win32.Kernel32;
import java.io.File;
import java.io.IOException;

public class OpenFolderAndSelectItem {

    public static String getShortPathName(String path) {
        char[] result = new char[256];
        Kernel32.INSTANCE.GetShortPathName(path, result, result.length);
        return Native.toString(result);
    }

    // add exception handling, left out only for the example
    public static void main(String[] args) throws IOException {
        String nfdFolderName = "c:\\temp\\fo\u0308lder";
        System.out.println("foldername with unicode character in NFD form: "
            + nfdFolderName);
        File file = new File(nfdFolderName);
        file.mkdir();
        // create some dummy files in that folder
        for (char c = '0'; c <= '9'; c++) {
            new File(nfdFolderName + "/file" + c).createNewFile();
        }
        // get the 8.3 short name of the folder
        String nfdFolderShortName = getShortPathName(nfdFolderName);
        // open the folder c:\temp\földer and select the file 'file4'
        ProcessBuilder process = new ProcessBuilder();
        process.command("explorer", "/select," + nfdFolderShortName
            + "\\file4");
        process.inheritIO();
        process.start();
    }
}

对于可能的下一个问题“如何选择多个文件”:我认为唯一的方法是编写自己的库/工具来实现SHOpenFolderAndSelectItems