我觉得我在这里遗漏了一些东西,我希望有人可以指出我正确的方向,因为我一直无法找到答案。
我有一个查看文档的应用程序,当找到值时,它会提示用户将此值替换为其他内容。我遇到的问题是;假设该文档有6个相同的值,我们将使用它只会更新第一个值然后继续。
文件示例:
one $
two $
three $
four $
five $
现在我明白一个字符串是不可变的,但我认为有一种循环信息的方法,我的当前代码如下;
DirectoryInfo di = new DirectoryInfo(scriptLocation);
FileInfo[] rgFiles = di.GetFiles("*.txt");
foreach (FileInfo fi in rgFiles)
{
FileInfo fileInfo = new FileInfo(fi.FullName);
string script = fileInfo.OpenText().ReadToEnd();
int dollarIndex = script.IndexOf("$");
string nextTenChars = script.Substring(dollarIndex - 17, 17);
string promptValue = CreateInput.ShowDialog(nextTenChars, "Input");
script = script.Replace("$", promptValue);
}
答案 0 :(得分:3)
它只会更新第一个值,然后继续前进。
原因是IndexOf返回字符串中第一个出现的索引。由于您已将整个文件作为一个字符串加载,因此在代码中显示为问题。
但如果你说:
他们在正确的文件中将是17个字符,是的,测试将是逐行的
然后我建议使用System.IO.File.ReadAllLines来读取文件。它将返回string[]
,并且每个位置都是一条线。所以你可以遍历这个数组并使用你的代码
DirectoryInfo di = new DirectoryInfo(scriptLocation);
FileInfo[] rgFiles = di.GetFiles("*.txt");
foreach (FileInfo fi in rgFiles)
{
string [] alllines = System.IO.File.ReadAllLines(fi.FullName);
for (int i = 0; i < alllines.Length; i++)
{
if(alllines[i].Contains("$"))
{
// prompt
int dollarIndex = alllines[i].IndexOf("$");
string nextTenChars = alllines[i].Substring(dollarIndex - 17, 17);
string promptValue = CreateInput.ShowDialog(nextTenChars, "Input");
alllines[i] = alllines[i].Replace("$", promptValue) ;
}
}
}
如果整条线仅包含17个字符加上美元符号,您可以简单地删除处理此行的行,并直接用整行替换用户进行替换
要回写文件,请使用简单的File.WriteAllLines方法
答案 1 :(得分:0)
报告此实例中首次出现的指定 Unicode字符或字符串的从零开始的索引。
所以在第一次替换你的循环之后会转到下一个文件而不是在同一个文件中查找。
您可以使用其他循环直到文档结尾。
答案 2 :(得分:0)
使用您的代码和Split
方法:
DirectoryInfo di = new DirectoryInfo(scriptLocation);
FileInfo[] rgFiles = di.GetFiles("*.txt");
foreach (FileInfo fi in rgFiles)
{
FileInfo fileInfo = new FileInfo(fi.FullName);
string script = fileInfo.OpenText().ReadToEnd();
var values = script.Split('$');
script = "";
foreach (var value in values)
{
string promptValue = CreateInput.ShowDialog(value, "Input");
script += promptValue;
}
}