1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JNAでデスクトップフォルダのパスを取得してみた

Last updated at Posted at 2022-02-22

これまでのあらすじ

いまさら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));
	}
}

最後だから一応ガワもつけて。
デスクトップだけじゃなくて他のスペシャル(?)なフォルダーのパスも取得できちゃいますね!

これにて解決。きれいさっぱり。

参考ページ

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?