web-dev-qa-db-ja.com

ローカルアプリケーションデータディレクトリへのパスを取得するクロスプラットフォームの方法は何ですか?

必要なのは、ローカルアプリケーションデータディレクトリへのパスを取得するプラットフォームに依存しない方法です。 System.getenv("LOCALAPPDATA")はWindowsでのみ機能するようです。これについてどうすればいいですか?

41
missingfaktor

あなたはおそらく次のようなことを言うことができます(私が間違っている場合、またはこれが悪いアプローチである場合、私と矛盾します)

_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");とそれを簡単に言うことができます同様に機能していました。

34
Mike Warren

個人的に、私は appdirs が同様のユースケースに非常に役立つことがわかりました。それ 機能を持っています さまざまな種類の便利なディレクトリを見つけます:

  • getUserDataDir
  • getUserConfigDir
  • getUserCacheDir
  • getUserLogDir
  • getSiteDataDir←これが必要なもののように見える
  • getSiteConfigDir

返される場所は多かれ少なかれ標準です。

14
kirelagin

クエストは古いですが、面白い絶対パスの代わりに環境変数をリストする回答がありません。 OSXについては何も知りません。この投稿には、WindowsとLinuxに関する情報のみが含まれています。

既存の回答を拡張するのに十分なポイントがないため、新しい回答を作成する必要があります。

Linux:前述のように、Linuxディストリビューションが満たそうとしている標準を定義しているfreedesktop.orgのようなものが存在します。環境変数とそのデフォルト値を定義するサブページもあります(設定されていない場合、デフォルトで空になります。アプリケーションは変数をデフォルトに一致させる必要があります)。そのページへのリンク: freedesktop.org env vars

この質問に関連して定義された値:

  • $ XDG_DATA_HOMElocal)(デフォルトは$ HOME /.local/share
  • $ XDG_CONFIG_HOMElocal)(デフォルトは$ HOME /.config
  • $ XDG_DATA_DIRSglobal)(デフォルトは/ usr/local/share /または/ usr/share /
  • $ XDG_CONFIG_DIRSglobal)(デフォルトは/ 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つの環境変数のみを伝えることができます。絶対パスの代わりにこれらを使用してください。

10
Fjolnir Dvorak

中程度の量のデータについては、Java.util.prefs.Preferences、言及 ここ 、またはjavax.jnlp.PersistenceService、説明 ここ 。どちらもクロスプラットフォームです。

9
trashgod

そのためのクロスプラットフォームの方法はありません。なぜなら、異なるOSが使用する概念はあまりにも異なるため、「抽象化」できないからです。私は* nixおよびMacの慣習に精通していませんが、Windowsには「ホームフォルダー」がなく、アプリケーションはローミングプロファイルC:\Users\<username>\AppData\Roaming\<application vendor>\<application name>\(デフォルト)またはローカルプロファイルC:\Users\<username>\AppData\Local\<application vendor>\<application name>\デフォルトで)。

これらのパスは、ネットワークインストールでは別の場所にある可能性があるため、ハードコーディングできないことに注意してください。環境変数はユーザーが変更できるため、環境変数に依存しないでください。アプリケーションは、Windows APIの SHGetKnownFolderPath 関数を呼び出す必要があります。

2つの違いは、ローカルプロファイルはユーザーとマシンに固有であり、ローミングプロファイルはユーザーに固有であるため、私の大学のような設定では、ローミングプロファイルに入れられたアプリがサーバーにアップロードされ、ログインしたコンピューターに同期します。

保存する設定がローカルであるかローミングであるかを選択するのは、アプリケーションの責任です。残念ながらJavaはアプリがこれを決定することを許可しません。代わりに、取得するフォルダーを決定するグローバルなユーザー構成可能な設定があります。

1
marczellm

問題は、他のオペレーティングシステムには「アプリケーションデータディレクトリ」という明確な概念さえないことです。通常、ユーザーのホームディレクトリにある隠しサブディレクトリであり、従来の名前がアプリケーション名である場合とそうでない場合があります。


機械式カタツムリのコメント:

違います。 Linuxには1つ(デフォルトでは〜/ .local)があり、OS Xにもあると思います。

まず、~/.localではありません。 ~/.local/shareです。 (または、少なくとも私のLinuxマシンにあります)。

第二に、これは新しいアイデアです。これは、 XDG Base Directory Specification を介して、「freedesktop.org」に由来するようです。 Linux/UNIXファイルシステムをどのように編成すべきかについて、より広く認識されている他の仕様では言及されていません。そして、彼らがこのページで彼らの「標準」について言っていることに注意してください: http://www.freedesktop.org/wiki/

最後に、このアイデアはLinuxコマンドの大部分では実装されていません。これはかなり非科学的ですが、Linuxボックスの隠しディレクトリを見ると、~/またはカスタムサブディレクトリを使用して、少なくとも40の異なるアプリケーションの兆候を見ることができます。対照的に、~/.local/shareにはわずか16個のアプリケーションの兆候しかありません。

の1/3未満のアプリケーションによって実装される命名規則は、「明確に定義された概念」ではありません。任意のアプリケーションのデータディレクトリを移植可能な方法で。

0
Stephen C