我正在尝试将\
替换为\\
,并且它适用于除我需要使用的特定变量以外的所有内容。抛出错误Illegal characters in path.
可能是因为它认为\ t是一个字符,它是制表符,因此在路径中是不允许的
使用Newtonsoft.Json将变量从json文件加载到类中
public class WebsiteConfig
{
public string Name { get; set; }
public string Directory { get; set; }
}
我尝试过
var escapedir = Regex.Replace(Directory, @"\\", @"\");
以及我可以形成var escapedir = Directory.Replace("\", "\\");
的任何可能方式。
尝试Regex.Replace("C:\test", @"\", @"\\");
(C:\ test与Directory中的完全相同)非常有效,然后在foreach中,我尝试将Directory与文件名结合在一起。
当前代码的“转储”:
var json = File.ReadAllText(Path.Combine(Environment.CurrentDirectory, "config.json"));
_config = JsonConvert.DeserializeObject<Config>(json);
foreach(WebsiteConfig website in _config.WebsiteConfigList)
{
for (int i = 0; i <= 9; i++)
{
string dir = website.Directory;
string escapedir = Regex.Replace(dir, @"\\", @"\\\\");
var path = Path.Combine(escapedir, "Backedup_" + i.ToString() + ".txt");
}
}
和config.json:
{
"WebsiteConfigList": [
{
"Name": "test",
"Directory": "C:\test"
}
]
}
答案 0 :(得分:2)
问题确实是由\t
引起的,但它是在反序列化期间发生的,而不是您可能认为的Path
引起的。有很多建议用转义的反斜杠替换反斜杠,但到那时损坏已经完成:
C:\test
已变成C: est
(空格是制表符)。
根据您的要求,不能更改输入文件,因此您必须在反序列化之前进行转义。我能想到的最简单的方法是:
json = json.Replace(@"\", @"\\");
顺便说一句,虽然Regex.Replace
非常强大,但string.Replace
还是足够的。
看起来您没有大型JSON文件,但是如果您有,请在string.Replace
的large files上阅读一点。
答案 1 :(得分:1)
如果您无法将源JSON更改为"C:\\test"
而不是"C:\test"
,请检测该标签并将其替换为所需的
string escapedir = Regex.Replace(dir, @"\t", @"\\\\t");