Kesulitannya adalah bahwa hal itu harus lintas platform. Windows 2000, XP, Vista, OSX, Linux, varian unix lainnya. Saya mencari potongan kode yang dapat mencapai hal ini untuk semua platform, dan suatu cara untuk mendeteksi platform.
Sekarang, anda harus menyadari bug 4787931 bahwa pengguna.rumah
tidak bekerja dengan benar, jadi tolong jangan memberikan saya buku jawaban, aku bisa menemukan diriku di manual.
Bug yang anda referensi (bug 4787391) telah diperbaiki di Jawa 8. Bahkan jika anda menggunakan versi yang lebih tua dari Jawa, Sistem.getProperty("user.rumah")
pendekatan ini mungkin masih yang terbaik. User.rumah
pendekatan tampaknya bekerja dalam jumlah yang sangat besar dari kasus. 100% anti peluru solusi pada Windows ini, karena Windows memiliki pergeseran konsep apa rumah directory berarti.
Jika pengguna.rumah
isn't cukup baik untuk anda saya sarankan untuk memilih definisi dari home directory
untuk windows dan menggunakan itu, mendapatkan lingkungan yang sesuai variabel dengan Sistem.getenv(String)
.
Sebenarnya dengan Jawa 8 cara yang tepat adalah dengan menggunakan:
System.getProperty("user.home");
Bug JDK-6519127 telah diperbaiki dan "tidak Kompatibel antara JDK 8 dan JDK 7" bagian dari catatan rilis menyatakan:
Area: Inti Libs / jawa.lang
Sinopsis
langkah-langkah Yang digunakan untuk menentukan pengguna's home directory pada Windows telah berubah untuk mengikuti Microsoft pendekatan yang disarankan. Perubahan ini mungkin diamati pada edisi yang lebih tua dari Windows atau di mana registry pengaturan atau variabel lingkungan yang ditetapkan ke direktori lain. Alam Ketidakcocokan
perilaku RFE
6519127
Meskipun pertanyaan yang lama saya tinggalkan ini untuk referensi di masa mendatang.
Konsep direktori RUMAH tampaknya menjadi sedikit samar-samar ketika datang ke Windows. Jika variabel lingkungan (DAPAT/HOMEPATH/USERPROFILE) apa't cukup, anda mungkin harus resor untuk menggunakan fungsi asli melalui DEV atau JNA. SHGetFolderPath memungkinkan anda untuk mengambil folder khusus, seperti Dokumen (CSIDL_PRIBADI) atau Local Settings\Application Data (CSIDL_LOKAL_APPDATA).
Contoh JNA kode:
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);
}
}
Orang lain telah menjawab pertanyaan sebelum saya, tapi sebuah program yang berguna untuk mencetak semua properti yang tersedia adalah:
for (Map.Entry<?,?> e : System.getProperties().entrySet()) {
System.out.println(String.format("%s = %s", e.getKey(), e.getValue()));
}
Karena saya sedang mencari Scala versi, semua aku bisa melihat adalah McDowell's JNA kode di atas. Saya termasuk saya Scala port di sini, seperti yang ada saat ini isn't-mana yang lebih tepat.
import com.sun.jna.platform.win32._
object jna {
def getHome: java.io.File = {
if (!com.sun.jna.Platform.isWindows()) {
new java.io.File(System.getProperty("user.home"))
}
else {
val pszPath: Array[Char] = new Array[Char](WinDef.MAX_PATH)
new java.io.File(Shell32.INSTANCE.SHGetSpecialFolderPath(null, pszPath, ShlObj.CSIDL_MYDOCUMENTS, false) match {
case true => new String(pszPath.takeWhile(c => c != '\0'))
case _ => System.getProperty("user.home")
})
}
}
}
Seperti dengan versi Java, anda akan perlu untuk menambahkan Jawa Asli Akses, termasuk file jar, untuk anda yang dirujuk perpustakaan.
It's bagus untuk melihat bahwa JNA sekarang ini jauh lebih mudah daripada ketika kode asli yang dikirimkan.
Saya akan menggunakan algoritma rinci dalam laporan bug menggunakan Sistem.getenv(String), dan mundur untuk menggunakan pengguna.dir properti jika tidak ada variabel lingkungan ditunjukkan valid direktori yang sudah ada. Ini harus bekerja cross-platform.
Saya pikir, di bawah Jendela, apa yang anda benar-benar setelah pengguna's nosional "dokumen" direktori.
Jika anda ingin sesuatu yang bekerja dengan baik pada windows ada paket yang disebut WinFoldersJava yang membungkus panggilan asli untuk mendapatkan 'khusus' direktori pada Windows. Kita sering menggunakannya dan itu bekerja dengan baik.
Alternatif akan menggunakan Apache CommonsIO FileUtils.getUserDirectory()
bukan Sistem.getProperty("user.rumah")
. Ini akan membuat anda mendapatkan hasil yang sama dan tidak ada kesempatan untuk memperkenalkan salah ketik ketika menentukan sistem properti.
Ada kemungkinan besar anda sudah memiliki Apache CommonsIO perpustakaan dalam proyek anda. Don't memperkenalkan jika anda berencana untuk menggunakannya hanya untuk mendapatkan di direktori home pengguna.