将\替换为\\不适用于特定变量

时间:2019-12-17 10:21:30

标签: c# backslash

我正在尝试将\替换为\\,并且它适用于除我需要使用的特定变量以外的所有内容。抛出错误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"
    }
  ]
}

下面是显示异常的屏幕截图: Screenshot of code

2 个答案:

答案 0 :(得分:2)

问题确实是由\t引起的,但它是在反序列化期间发生的,而不是您可能认为的Path引起的。有很多建议用转义的反斜杠替换反斜杠,但到那时损坏已经完成:

C:\test已变成C: est(空格是制表符)。

根据您的要求,不能更改输入文件,因此您必须在反序列化之前进行转义。我能想到的最简单的方法是:

json = json.Replace(@"\", @"\\");

顺便说一句,虽然Regex.Replace非常强大,但string.Replace还是足够的。


看起来您没有大型JSON文件,但是如果您有,请在string.Replacelarge files上阅读一点。

答案 1 :(得分:1)

如果您无法将源JSON更改为"C:\\test"而不是"C:\test",请检测该标签并将其替换为所需的

string escapedir = Regex.Replace(dir, @"\t", @"\\\\t");