0

概要:を使用するすべての人のための1App.configつのファイル。デフォルト値を登録する必要があります。存在しない場合はデフォルト値で作成する必要があります。ローカルとグローバルの構成ファイル。App.exewxFileConfigApp.config


私の単純なアプリケーションは、アプリケーションが配置されているのと同じディレクトリにあるグローバル構成ファイルを、実行可能ファイルと同じ名前で、.config拡張子を付けて使用します。構成ファイルがまだ存在しない場合は、ユーザー用に作成する必要があります。ユーザーは、エディタを使用してファイルを変更し、デフォルト値を置き換える必要があります。これまでのところ、次のコードがあります。

// The configuration file name has has the executable name 
// but with the ".config" extension.
//
wxFileName configFileName(wxStandardPaths::Get().GetExecutablePath());
configFileName.SetExt("config");

// The config object uses the above file name, and captures the defaults.
//
wxFileConfig * pConfig = new wxFileConfig(wxEmptyString,
                                          wxEmptyString,
                                          wxEmptyString, 
                                          configFileName.GetFullPath(),
                                          wxCONFIG_USE_GLOBAL_FILE);
pConfig->SetRecordDefaults();    // to capture the defaults
wxFileConfig::Set(pConfig);      // to be globally accessible

// One of the configuration values is the file name for the exported
// values (the app.exe functionality, unrelated to the config file name).
// It uses a subdirectory with the name built out of the exe path, its name
// without the extension, with the "_OUTPUT" appended.
// For example, "some/path/App.exe" should produce "some/path/App_OUTPUT".
// The file name is again constructed from the bare app name with 
// the ".txt" extension.
//
wxFileName outfname(configFileName.GetPath());            // same as the exe path
outfname.AppendDir(configFileName.GetName() + "_OUTPUT"); // the subdir
outfname.SetName(configFileName.GetName());               // same name as app has
outfname.SetExt("txt");                                   // with the .txt extension
outfname.Normalize();  // actually, my real path contains also ".."    

// The above constructed filename is the default for the "output" key.
// I expect to be recorded into the pConfig because of the above
// pConfig->SetRecordDefaults();   Is my expectation correct?
//
m_output_filename = pConfig->Read("output", outfname.GetFullPath());

今...まだ存在しない場合、構成ファイルを物理的に書き込む方法は? 私は次のようなことを考えていました:

if (! configFileName.Exists())
{
    pConfig->??? What should be called?
}

ファイルを書き込むかどうかを決定するより良い方法はありますか? たとえば、pConfigデフォルト値によって変更されました。ダーティ コンテンツを書き戻す方法はありますか?

見つけましFlush()たが、最初に次のコードが含まれています。

if ( !IsDirty() || !m_fnLocalFile.GetFullPath() )
    return true;

...そして、私の構成ファイルはグローバルなものとして渡されました(wxFileConfig上記の作成を参照)。ローカル構成ファイルが設定されていません。構成ファイルは、すべての人にとって単一の構成ファイルになりますが、ローカルのものとして渡す必要がありますか?

更新:次のように構成ファイルをローカル ファイルに変更しようとしました。

wxFileConfig * pConfig = new wxFileConfig(wxEmptyString,
                                          wxEmptyString,
                                          configFileName.GetFullPath(),
                                          wxEmptyString,
                                          wxCONFIG_USE_LOCAL_FILE);

次に、Flush()構成ファイルの作成を引き起こします。おそらくデストラクタから自動的に呼び出されることさえあります。ただし、構成ファイルはローカルのものでなければなりません。質問で前に示したように、それは機能しませんwxCONFIG_USE_GLOBAL_FILE。それを確認できますか?それは期待される動作ですか?

あなたの時間と経験をありがとう、

ペトル

4

1 に答える 1

1

wxConfig設計上、グローバル構成ソース (ファイルまたはレジストリ ハイブなど) に書き込むことは絶対にありません。その理由を理解するには、単純にそれを実行する権限がない可能性があることを考慮してください。実際、通常はそうではありません。

特に、Unix では、/etc/myapp.confプログラムを実行しているユーザーが作成するのではなく、システム管理者がプログラムを編集するときに、グローバル構成ファイル (のようなもの) をインストールする必要があります。

于 2012-11-14T13:24:29.207 に答える