1

私のアプリはこのコードを使用して ArrayList を永続的に保存し、アプリの再起動時に呼び出すことができるようにします。

    private static void storeDevices() {
    // Object serialization
    try {
        FileOutputStream fos = new FileOutputStream("devices.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(devices);
        oos.flush();
        oos.close();
    }
    catch(Exception e) {
        showAlert("Store Devices", "Exception storing devices to file: " + e);
    } 
}

Netbeans から実行すると、すべて正常に動作します。(Launch4J と Inno Setup Compiler を使用して) アプリをインストーラーにラップしました。アプリを C:/Program Files/MyApp (Windows 7 の場合) にインストールすると、上記のコードで次の例外が発生します。

デバイスをファイルに保存する例外: java.io.FileNotFoundException: devices.ser (アクセスが拒否されました)

ただし、C:/MyApp にインストールすると、すべて正常に動作します。

これは、C:/Program Files ディレクトリから継承された読み取り/書き込み許可と関係がありますか? C:/temp ディレクトリまたはそのような場所にファイルを作成することでこれを解決できる可能性があることはわかっていますが、それに頼る必要はありません。C:/Program Files/MyApp ディレクトリにファイルを読み書きできる方法はありますか?

4

2 に答える 2

0

私の解決策は、環境変数を使用して、アプリケーション データを格納する正しいディレクトリを取得することでした。作成したメソッドは次のとおりです。

private String getAppDataDirectory(String subDirectory, boolean create) {

    String appDataDirectory;
    try {
        appDataDirectory = System.getenv("APPDATA"); //Windows
        //todo - could try "ALLUSERSPROFILE"
        if (appDataDirectory != null) {
            appDataDirectory += File.separator + subDirectory + File.separator;
        }
        else { //appDataDirectory is null
            appDataDirectory = System.getenv("HOME"); //Unix
            if (appDataDirectory != null) {
                appDataDirectory +=  File.separator + subDirectory + File.separator;
            }
            else { //appDataDirectory is still null
                throw new Exception("Could not access APPDATA or HOME environment variables");
            }
        }
    }
    catch(Exception e) {
        e.printStackTrace();
        appDataDirectory = "";
    }

    if (create && appDataDirectory != null && appDataDirectory.length() > 0) {
        try {
            File dir = new File(appDataDirectory);
            dir.mkdir();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }

    //log("appDataDirectory: " + appDataDirectory);
    return appDataDirectory;
}
于 2013-04-08T12:06:26.377 に答える
0

Windows Vista 以降では、明示的な認証なしにシステム フォルダー領域にアクセスできるアプリはありません。(program-file/window32/ などのフォルダ....) インストールされたアプリの場合、認証は windows-installer によって行われます。

アクセス (読み取り/書き込み) できるようにするには、管理者として実行するか、それらのフォルダーのアクセス許可を変更する必要があります (これはお勧めできません)。

于 2013-03-28T11:43:03.240 に答える