これまでのあらすじ
いまさらJavaでGUIやらなきゃになったんだけれど、デスクトップフォルダのパスってどう取ればいいのん?
失敗したやつ
System.out.println(System.getProperty("user.home"), "Desktop");
ぐぐるとよく出てくるやつなんだけれど、OneDriveとか入ってるとこれじゃあダメなのね。やだめんどいー!
ちょっともやっとするやつ
Runtime.exec()でレジストリ読む方法。このパスどのくらい汎用性あるのかわからないんですが。
public static void regTest() throws IOException {
String cmd = "reg query \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\" /v Desktop";
Process process = Runtime.getRuntime().exec(cmd);
try(BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
String line = null;
while ((line = br.readLine()) != null) {
if(line.indexOf("Desktop") != -1) {
System.out.println(line);
}
}
}
// 出力結果はこんな感じ
// Desktop REG_SZ C:\Users\yamane\Desktop
}
ここからsubstringとかでパスを抽出するとかするわけだけれど、なんというか泥臭い&レジストリ直とかお行儀わるいよね感が半端ない。
そういえばJNAがあるじゃない
と、ここまできてふと思ったのです。「IME制御のために既にJNA使ってるんだし、こっちでできるんじゃない?」と。
どうにもうまくまとまったドキュメントが見つからないので、jarの中身を展開して眺めていたら、あるじゃないですか。これじゃん。
SpecialFolderTest.java
package test;
import com.sun.jna.platform.win32.Shell32Util;
import com.sun.jna.platform.win32.ShlObj;
public class SpecialFolderTest {
public static void main(String[] args) {
System.out.println(Shell32Util.getSpecialFolderPath(ShlObj.CSIDL_DESKTOP, false));
}
}
最後だから一応ガワもつけて。
デスクトップだけじゃなくて他のスペシャル(?)なフォルダーのパスも取得できちゃいますね!
これにて解決。きれいさっぱり。
参考ページ