我来自Java世界 - 并且Java属性文件可以通过以下方式相互构建...
base.dir=C:\dev\basedir
logging.dir=$(base.dir)\logs # results in C:\dev\basedir\logs
output.dir=$(base.dir)\output # results in C:\dev\basedir\output
如何使用设置和 app.config 文件在.NET项目中完成相同的操作?我花了很长时间搜索,发现什么都没有用......
app.config 中的以下方法不起作用(返回文字值)...
<setting name="baseDir" serializeAs="String">
<value>C:\dev\basedir</value>
</setting>
<setting name="logDir" serializeAs="String">
<value>$(baseDir)log\</value>
</setting>
答案 0 :(得分:0)
我不熟悉在app.config文件中执行此操作的方法。不过,在程序中编写这样的功能会相当容易。
<setting name="baseDir" serializeAs="String">
<value>C:\dev\basedir</value>
</setting>
<setting name="logDir" serializeAs="String">
<value>log\</value>
</setting>
然后,在您的C#中,您可以使用Path
帮助程序类将它们组合在一起。 (注意,这是未经测试的,我在内存中编码语法如何为userSettings而不是appSettings工作)。
System.IO.Path.Combine(Properties.Settings.Default.baseDir,
Properties.Settings.Default.logDir);
答案 1 :(得分:0)
提供我自己的问题的跟进答案......
假设属性文件如下所示:
## Directories
base.dir=C:\PdfProcessing
archive.dir=${base.dir}\archive
manual.process.dir=${base.dir}\manual_process
以下类将属性文件解析为map ...
static class PropertiesFileReader
{
private static string PathToPropertiesFile = @"application.properties";
private static Regex subRegex = new Regex(@"\$\{.*\}");
/// <summary>
/// Parses the properties file into a map
/// </summary>
/// <returns></returns>
public static Dictionary<string, string> ReadProperties() {
var data = new Dictionary<string, string>();
foreach (var row in File.ReadAllLines(PathToPropertiesFile))
{
var newRow = String.Empty;
// ignore any rows that are commented out
// or do not contain an equals sign
if (!row.StartsWith("#") && row.Contains("="))
{
// replace each instance of a variable placeholder in the property value
foreach (Match match in subRegex.Matches(row))
{
var key = Regex.Replace(match.ToString(), @"[${}]", String.Empty);
var replaceValue = data[key];
newRow = row.Replace(match.ToString(), replaceValue);
}
// add the property key and value
if (!String.IsNullOrEmpty(newRow))
{
data.Add(newRow.Split('=')[0], string.Join("=", newRow.Split('=').Skip(1).ToArray()));
}
else
{
data.Add(row.Split('=')[0], string.Join("=", row.Split('=').Skip(1).ToArray()));
}
}
}
return data;
}
}
然后以这种方式给读者打电话......
private static readonly Dictionary<string, string> props = PropertiesFileReader.ReadProperties();
以这种方式访问属性值...
props["archive.dir"] # C:\PdfProcessing\archive