我目前正在开发一种Web服务,它可以检索XML消息,对其进行归档然后进一步处理。从Web.config中读取存档文件夹。这就是归档方法的样子
private void Archive(System.Xml.XmlDocument xmlDocument)
{
try
{
string directory = System.Configuration.ConfigurationManager.AppSettings.Get("ArchivePath");
ParseMessage(xmlDocument);
directory = string.Format(@"{0}\{1}\{2}", directory, _senderService, DateTime.Now.ToString("MMMyyyy"));
System.IO.Directory.CreateDirectory(directory);
string Id = _messageID;
string senderService = _senderService;
xmlDocument.Save(directory + @"\" + DateTime.Now.ToString("yyyyMMdd_") + Id + "_" + System.Guid.NewGuid().ToString().Substring(0, 13) + ".xml");
}
我检索的路径结构是C:\ Program Files \ Subfolder \ Subfolder。在开发,QA,UAT和PRD环境中一切正常。但是在另一台机器上我现在需要安装Web服务(不幸的是我无法调试),目录字符串是'C:Files'。 为了确保我在不同的机器上仔细检查了.NET版本(我想也许在字符串之前使用@是依赖于版本的);所有机器都使用2.0.50727。
有人认出这个问题吗?
提前致谢!
编辑:我在目录变量之前看到@对我问的问题引起了一些混淆。这不是关于@(事实上,那不应该在那里。我已经删除了它。)我的问题(改写)是: 当你在引用的字符串之前放置一个@,比如@“c:\ folder \ subfolder”,它确保反斜杠不被解释为转义字符,对吧?它可能是什么原因导致它在一台机器上工作,而不是在另一台机器上工作? (我确实同意顺便使用Path.Combine的答案。我只是好奇是什么导致了这种不一致的行为)
答案 0 :(得分:7)
您可以尝试使用Path.Combine()而不是String.Format()。好example is here。
答案 1 :(得分:0)
从配置文件中提取值后,它会自动正确转义。目录变量名称上的“@”符号未将其设置为“显式” - 它告诉编译器它是一个命名参数。例如:
public void (string[] args)
{
int length = args.Length;
length = @args.Length; // Same thing!
}
变量名称上的“@”运算符表示不将该符号视为保留字。它允许您使用与关键字相同的名称创建变量名称:
public static void Foo(object @class)
{
//@class exists here, even though class is a reserved keyword!
}
此外,如果它获得的值是'C:Files',那么这是无效的,因为它缺少'\'。 'C:\ Files'有效。
答案 2 :(得分:0)
使用Path.Combine(),例如:
strFilename = CombinePaths(directory, _senderService) + DateTime.Now.ToString("MMMyyyy");
答案 3 :(得分:0)
从你的问题我认为你已经对待了:
@directory
好像它执行的功能与:
相同@"c:\myfolder\"
不同之处在于,第一个示例允许您使用保留字作为变量名,如@class(不习惯使用它),第二个示例允许字符串包含非转义字符,如