摘要:使用App.config
,App.exe
的每个人都应该注册默认值的单wxFileConfig
个文件,应创建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
。你能证实吗?这是预期的行为吗?
感谢您的时间和经验,
彼得
答案 0 :(得分:1)
wxConfig
绝对不会通过设计写入全局配置源(文件或注册表配置单元或其他)。要理解为什么,请考虑它可能没有权限去做 - 事实上,通常不会。
特别是在Unix下,全局配置文件(类似/etc/myapp.conf
)应该在您的程序由系统管理员编辑时安装,而不是由运行该程序的用户创建。