Khái niệm về thư mục HOME có vẻ hơi mơ hồ khi nói đến Windows. Nếu environment variables (HOMEDRIVE/HOMEPATH/USERPROFILE) không đủ, bạn có thể phải sử dụng chức năng gốc thông qua JNI hoặc JNA. SHGetFolderPath cho phép bạn lấy lại các thư mục đặc biệt, như My Documents (CSIDL _ CÁ NHÂN) hoặc Local Settings \ Application Data (CSIDL _ ĐỊA PHƯƠNG _ APPDATA).
đang JNA
mẫu:
public class PrintAppDataDir {
public static void main(String[] args) {
if (com.sun.jna.Platform.isWindows()) {
HWND hwndOwner = null;
int nFolder = Shell32.CSIDL_LOCAL_APPDATA;
HANDLE hToken = null;
int dwFlags = Shell32.SHGFP_TYPE_CURRENT;
char[] pszPath = new char[Shell32.MAX_PATH];
int hResult = Shell32.INSTANCE.SHGetFolderPath(hwndOwner, nFolder,
hToken, dwFlags, pszPath);
if (Shell32.S_OK == hResult) {
String path = new String(pszPath);
int len = path.indexOf('\0');
path = path.substring(0, len);
System.out.println(path);
} else {
System.err.println("Error: " + hResult);
}
}
}
private static Map<String, Object> OPTIONS = new HashMap<String, Object>();
static {
OPTIONS.put(Library.OPTION_TYPE_MAPPER, W32APITypeMapper.UNICODE);
OPTIONS.put(Library.OPTION_FUNCTION_MAPPER,
W32APIFunctionMapper.UNICODE);
}
static class HANDLE extends PointerType implements NativeMapped {
}
static class HWND extends HANDLE {
}
static interface Shell32 extends Library {
public static final int MAX_PATH = 260;
public static final int CSIDL_LOCAL_APPDATA = 0x001c;
public static final int SHGFP_TYPE_CURRENT = 0;
public static final int SHGFP_TYPE_DEFAULT = 1;
public static final int S_OK = 0;
static Shell32 INSTANCE = (Shell32) Native.loadLibrary("shell32",
Shell32.class, OPTIONS);
/**
* see http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx
*
* HRESULT SHGetFolderPath(HWND hwndOwner, int nFolder, HANDLE hToken,
* DWORD dwFlags, LPTSTR pszPath);
*/
public int SHGetFolderPath(HWND hwndOwner, int nFolder, HANDLE hToken,
int dwFlags, char[] pszPath);
}
}
Bạn đã thử các giải pháp được đề cập trong lỗi chưa? Có rất nhiều gợi ý. –
lỗi 4787931 cho các phiên bản java lên đến 1.4.2 xuất hiện trở lại dưới dạng lỗi 6519127 cho java 1.6. Vấn đề sẽ không biến mất và vẫn được liệt kê là ưu tiên thấp. – GregA100k
Lưu ý: lỗi 4787391 được đánh dấu là cố định trong Java 8 –