13

なんらかの理由で、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」です)

4

4 に答える 4

4

純粋なJavaの方法はありませんが、JNIのJNAラッパーを使用して、ネイティブコードを自分で作成しなくても実行できます。応答の途中でWindowsのドキュメントフォルダを取得する方法の良い例があります:

Javaでユーザーのホームディレクトリを見つける最良の方法は何ですか?

于 2010-11-07T00:27:29.060 に答える
3

Windows ユーザーの 'Documents' フォルダーを見つけるための時間はかかりますが信頼できる方法: Reg.exe (Windows システム ファイル) を使用するバット スクリプトを Java アプリで実行して、パスを持つ reg キーの値を見つけます。初期化。次に、同じbatファイルでパイプラインを使用して、そのデータをWindowsコマンドプロンプトにある「findstr」機能に送信します。別のパイプラインを使用して、戻り値をテキスト ファイルに出力します。次に、Javaアプリにそのテキストファイルを読み取らせ、完了したら削除します:)私にとっては十分に機能しました。

バットファイルのコード:

@ echo off

Title Find Documents Folder

Reg Query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" |findstr "Personal">>DocPath.dat

exit
于 2012-07-14T18:40:57.597 に答える
0

誰かが作成したカスタム Java API があります (彼らのウェブサイトは機能しなくなりました) が、Google Code にコードが残っています:

http://winfoldersjava.googlecode.com/files/WinFoldersJava_1.1.zip

各アーキテクチャ (x86 および x64) に 1 つずつ、参照する必要がある 2 つの DLL があります。

于 2010-11-06T18:43:04.243 に答える
-1

user.home は「マイ ドキュメント」ではなく、Unix のようなユーザーのホーム フォルダー ~/. 「マイ ドキュメント」にアクセスするには、 System.getProperty("user.home")+"\Documents"; を使用できます。言語システムに関係なく。それを試してみてください。

于 2010-11-06T18:46:08.833 に答える