0

摘要:App.config每个人使用的单个文件App.exewxFileConfig应该注册默认值,App.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 回答