私が必要としているのは、ローカル アプリケーション データ ディレクトリへのパスを取得するプラットフォームに依存しない方法です。System.getenv("LOCALAPPDATA")
Windowsでのみ動作するようです。どうすればいいですか?
6 に答える
あなたはおそらく次のように言うことができます(私が間違っている場合、またはこれが悪いアプローチである場合は矛盾します)
private String workingDirectory;
//here, we assign the name of the OS, according to Java, to a variable...
private String OS = (System.getProperty("os.name")).toUpperCase();
//to determine what the workingDirectory is.
//if it is some version of Windows
if (OS.contains("WIN"))
{
//it is simply the location of the "AppData" folder
workingDirectory = System.getenv("AppData");
}
//Otherwise, we assume Linux or Mac
else
{
//in either case, we would start in the user's home directory
workingDirectory = System.getProperty("user.home");
//if we are on a Mac, we are not done, we look for "Application Support"
workingDirectory += "/Library/Application Support";
}
//we are now free to set the workingDirectory to the subdirectory that is our
//folder.
このコードでは、Javaがディレクトリを扱う場合'/'
と同じように扱うことを最大限に活用していることに注意してください。'\\'
Windows は'\\'
pathSeparator として使用しますが、これでも問題あり'/'
ません。(少なくとも Windows 7 はそうです。) また、環境変数では大文字と小文字が区別されません。私たちは同じように簡単に言うことができworkingDirectory = System.getenv("APPDATA");
、それは同じようにうまくいったでしょう.
appdirs
個人的には、同様のユースケースに非常に役立つことがわかりました。さまざまな種類の便利なディレクトリを見つける機能があります。
getUserDataDir
getUserConfigDir
getUserCacheDir
getUserLogDir
getSiteDataDir
←これが必要なようですgetSiteConfigDir
返される場所は多かれ少なかれ標準的です。
- Unix では、XDG Base Directory Specificationに従います。
- Windows では、SHGetFolderPathを呼び出します。
- macOS では、既知のハードコードされたパスを使用します。
クエストは古いですが、面白い絶対パスではなく、環境変数をリストする回答がありません。私はOSXについて何も知りません。この投稿には、Windows と Linux に関する情報のみが含まれています。
既存の回答を拡張するのに十分なポイントがないため、新しい回答を作成する必要があります。
Linux: 前述のように、Linux ディストリビューションが実現しようとしている標準を定義している freedesktop.org のようなものがあります。環境変数とそのデフォルト値を定義するサブページもあります (設定されていない場合、デフォルトでは空です。アプリケーションは変数をデフォルトに一致させる必要があります)。そのページへのリンク: freedesktop.org env vars
この質問に関連して定義された変数:
- $XDG_DATA_HOME ( local ) (デフォルト: $HOME/.local/share )
- $XDG_CONFIG_HOME ( local ) (デフォルト: $HOME/.config )
- $XDG_DATA_DIRS ( global ) (デフォルト: /usr/local/share/または/usr/share/ )
- $XDG_CONFIG_DIRS ( global ) (デフォルト: /etc/xdg )
Windows XP:
%APPDATA% (デフォルト: C:\Documents and Settings{username}\Application Data )
%CommonProgramFiles% (デフォルト: C:\Program Files\Common Files ) (共有プログラム ファイル)
%CommonProgramFiles(x86)% (デフォルト: C:\Program Files (x86)\Common Files ) (64 ビットのみ!) (共有プログラム ファイル)
%ProgramFiles% (デフォルト: %SystemDrive%\Program Files )
%ProgramFiles(x86)% (デフォルト: %SystemDrive%\Program Files (x86) (64 ビット バージョンのみ)) (64 ビットのみ!)
Windows Vista +:
- %APPDATA% (デフォルト: C:\Users{username}\AppData\Roaming ) (リンクされたワークステーション間で共有。ユーザー ローカル。ファイルと構成を保存)
- %LOCALAPPDATA% (デフォルト: C:\Users{username}\AppData\Local ) (ユーザー ローカル。ファイルと構成を保存)
- %CommonProgramFiles% (デフォルト: C:\Program Files\Common Files ) (共有プログラム ファイル)
%CommonProgramFiles(x86)% (デフォルト: C:\Program Files (x86)\Common Files ) (64 ビットのみ!) (共有プログラム ファイル)
%ProgramFiles% (デフォルト: %SystemDrive%\Program Files ) (インストール後に変更されない静的データ)
%ProgramFiles(x86)% (デフォルト: %SystemDrive%\Program Files (x86) (64 ビット バージョンのみ)) (64 ビットのみ!) (インストール後に変更されない静的データ)
%ProgramData% (デフォルト: %SystemDrive%\ProgramData ) (すべてのユーザーに影響する変更可能なデータ)
要するに、 Linuxには、設定されていない可能性のある2つの環境変数があります(1つは設定用、もう1つはファイル用)。Windowsには、構成とファイルを一緒に使用するための環境変数が1つしかないことがわかります。絶対パスの代わりにこれらを使用してください。
これを使用できます
String currentDir = new File(".").getAbsolutePath();
またはこれ:
System.getProperty("user.dir")
私は最初のオプションを好みます
よろしく