目前我有一些代码可以替换文件中的字符串,如下所示:
File.WriteAllText(filePath, Regex.Replace(File.ReadAllText(filePath),
"( " + column.Key + " )",
" " + column.Value + " "
));
File.WriteAllText(filePath, Regex.Replace(File.ReadAllText(filePath),
"(\\[\"" + column.Key + "\"\\])",
"[\"" + column.Value + "\"]"
));
但是,每个替换都打开和关闭文件,似乎偶尔它们运行“太快”并且一个替换将无法工作,因为该文件在先前的字符串替换中尚未关闭。有没有我可以重用的代码解决了这个问题,也许使用FileStream类(所以我可以打开和关闭一次)?或者建议更好的方法吗?只是想知道是否有更简单的事情,我必须创建比我想要替换的字符串的字节数组,并手动编写代码来读取,写入和搜索字节。感谢。
答案 0 :(得分:4)
更好的做法是读取文件的内容一次,将其存储到本地变量中。然后执行您需要的任何更改(在您的情况下,两个正则表达式),然后将该输出写入该文件。文件IO是计算机可以执行的最昂贵的操作之一,并且内存计算要便宜得多。尽可能少地击中磁盘,只要你能避免它。
答案 1 :(得分:3)
好吧,我会用:
string text = File.ReadAllText(filePath);
text = Regex.Replace(...);
text = Regex.Replace(...);
...
File.WriteAllText(filePath, text);
听到原始代码无法正常工作,我仍然感到惊讶。在多次写入和读取方面,这并不令人愉快,但我希望它能够正常工作。
答案 2 :(得分:2)
string contents = File.ReadAllText(filePath);
contents = Regex.Replace(contents,
"( " + column.Key + " )",
" " + column.Value + " ");
contents = Regex.Replace(contents,
"(\\[\"" + column.Key + "\"\\])",
"[\"" + column.Value + "\"]");
File.WriteAllText(filePath, contents);
答案 3 :(得分:1)
听起来你应该对驻留在内存中的字符串进行所有字符串替换,然后将最终生成的字符串写入磁盘。
答案 4 :(得分:1)
var fileContents = File.ReadAllText(filePath);
fileContents = Regex.Replace(fileContents,
"( " + column.Key + " )",
" " + column.Value + " "
);
fileContents = Regex.Replace(fileContents ,
"(\\[\"" + column.Key + "\"\\])",
"[\"" + column.Value + "\"]"
);
File.WriteAllText(filePath, fileContents);
答案 5 :(得分:1)
嗯,最简单的方法是ReadAllText
,替换你的WriteAllText
。
var text = File.ReadAllText(filePath);
text = Regex.Replace(text,"( " + column.Key + " )"," " + column.Value + " ");
text = Regex.Replace(text,"(\\[\"" + column.Key + "\"\\])","[\"" + column.Value + "\"]");
File.WriteAllText(text,filePath);