javawindowsshort-filenames

How to get short-filenames in Windows using Java?


How to get the short-filename for a long-filename in Windows using Java?

I need to determine the short-filenames of files, stored on a Windows system, using Java(tm).


Solution

  • Self Answer

    There are related questions with related answers. I post this solution, however, because it uses Java(tm) code without the need for external libraries. Additional solutions for different versions of Java and/or Microsoft(R) Windows(tm) are welcome.

    Main Concept

    Main concept lies in calling CMD from Java(tm) by means of the runtime class:

    cmd /c for %I in ("[long file name]") do @echo %~fsI

    Solution

    Tested on Java SE 7 running on Windows 7 system (Code has been reduced for brevity).

        public static String getMSDOSName(String fileName)
        throws IOException, InterruptedException {
    
        String path = getAbsolutePath(fileName);
    
        // changed "+ fileName.toUpperCase() +" to "path"
        Process process =
            Runtime.getRuntime().exec(
                "cmd /c for %I in (\"" + path + "\") do @echo %~fsI");
    
        process.waitFor();
    
        byte[] data = new byte[65536];
        int size = process.getInputStream().read(data);
    
        if (size <= 0)
            return null;
    
        return new String(data, 0, size).replaceAll("\\r\\n", "");
    }
    
    public static String getAbsolutePath(String fileName)
        throws IOException {
        File file = new File(fileName);
        String path = file.getAbsolutePath();
    
        if (file.exists() == false)
            file = new File(path);
    
        path = file.getCanonicalPath();
    
        if (file.isDirectory() && (path.endsWith(File.separator) == false))
            path += File.separator;
    
        return path;
    }