Proper method to find user's My Documents folder on Windows with Java?

Aleksei Vasiliev picture Aleksei Vasiliev · Nov 6, 2010 · Viewed 12.1k times · Source

For whatever reason, I sometimes need to find the current user's My Documents folder on Windows in a Java program to read some files. But as far as I can tell, there is no way to do it that isn't severely flawed.

The first wrong way: System.getProperty("user.home");
Why it won't work:

  • It only returns the \username\ folder; I'd need to add "\Documents\" on to the end to get the Documents folder... and that only works in English.
  • Sun bugs 6519127 and 4787931. Java finds the user home folder on Windows by reading a deprecated registry key* to find the Desktop then taking the parent; this method has multiple known problems that will easily cause a completely wrong folder to be returned. The bugs are 3.75 years and 8 years old with no fix.

The second wrong way: Using a registry-reading program to get the Personal folder of the user, which is My Documents (but i18n'd).
Why it won't work:
While it fixes the English-only problem, it's still using the same deprecated registry area, so the bugs still apply to it.

The deprecated registry key says to use a native call (SHGetKnownFolderPath) which I obviously can't do from Java.

The third wrong way:

JFileChooser fr = new JFileChooser();  
FileSystemView fw = fr.getFileSystemView();  
File documents = fw.getDefaultDirectory();

Why it won't work: It works great!
Except when it doesn't. While I had a program that used this open and running in the background, I opened a DirectX game (Fallout: New Vegas). The Java program immediately terminated with no stack trace. Always reproducible (for me on that game, and who knows what else). Couldn't find a Sun bug#.

So is there any method to find a user's Documents folder, on Windows, from Java, that doesn't have known problems?

(This is a nice big question.)

*(The key is "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders")

Answer

marcprux picture marcprux · Nov 7, 2010

There's no pure java way to do it, but you could use the JNA wrapper over JNI to do it without having to write any native code yourself. There's a good example of how to get the Documents folder on Windows halfway down the responses at:

What is the best way to find the users home directory in Java?