なんらかの理由で、Java プログラムで Windows 上の現在のユーザーの My Documents フォルダーを見つけて、いくつかのファイルを読み取る必要がある場合があります。しかし、私が知る限り、深刻な欠陥のない方法はありません。
最初の間違った方法: System.getProperty("user.home");
うまくいかない理由:
- \username\ フォルダーのみを返します。Documents フォルダーを取得するには、最後に「\Documents\」を追加する必要があります...これは英語でのみ機能します。
- Sun バグ 6519127および 4787931。Java は、非推奨のレジストリ キー* を読み取ってデスクトップを見つけ、次に親を取得することにより、Windows 上のユーザー ホーム フォルダを見つけます。このメソッドには複数の既知の問題があり、完全に間違ったフォルダーが返されてしまいます。バグは 3.75 年と 8 年前のもので、修正されていません。
2 番目の間違った方法: レジストリ読み取りプログラムを使用して、ユーザーの個人用フォルダーを取得します。これは My Documents (ただし i18n 化されています) です。
動作しない理由:
英語のみの問題は修正されますが、廃止された同じレジストリ領域が引き続き使用されるため、バグは依然として適用されます。
非推奨のレジストリ キーは、Java からは明らかにできないネイティブ呼び出し (SHGetKnownFolderPath) を使用するように指示しています。
3 番目の間違った方法:
JFileChooser fr = new JFileChooser();
FileSystemView fw = fr.getFileSystemView();
File documents = fw.getDefaultDirectory();
うまくいかない理由: うまくいきます!
そうでない場合を除いて。これを使用してバックグラウンドで実行するプログラムがある間に、DirectX ゲーム (Fallout: New Vegas) を開きました。Java プログラムは、スタック トレースなしですぐに終了しました。常に再現可能です(そのゲームの私にとって、そして誰が他に何を知っているか)。Sun のバグが見つかりませんでした#。
では、既知の問題がない Java から、Windows でユーザーの Documents フォルダを見つける方法はありますか?
(これは素晴らしい大きな質問です。)
*(キーは「HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders」です)