我正在与使用控制台应用程序覆盖文本文件进行一些更改。我在这里逐行阅读文件。任何人都可以帮助我。
StreamReader sr = new StreamReader(@"C:\abc.txt");
string line;
line = sr.ReadLine();
while (line != null)
{
if (line.StartsWith("<"))
{
if (line.IndexOf('{') == 29)
{
string s = line;
int start = s.IndexOf("{");
int end = s.IndexOf("}");
string result = s.Substring(start+1, end - start - 1);
Guid g= Guid.NewGuid();
line = line.Replace(result, g.ToString());
File.WriteAllLines(@"C:\abc.txt", line );
}
}
Console.WriteLine(line);
line = sr.ReadLine();
}
//close the file
sr.Close();
Console.ReadLine();
我在这里收到错误文件已被其他进程打开。
请帮助我,任何人。 主要任务是覆盖相同的texfile并进行修改
答案 0 :(得分:0)
你需要一个流, 打开它进行阅读和写作。
FileStream fileStream = new FileStream(
@"c:\words.txt", FileMode.OpenOrCreate,
FileAccess.ReadWrite, FileShare.None);
现在您可以使用fileStream.Read() and fileStream.Write()
方法
请参阅此链接以进行扩展讨论
答案 1 :(得分:0)
问题是您正在尝试写入StreamReader
使用的文件。你必须关闭它 - 或者 - 更好 - 使用using
- 语句即使在出错时也会处理/关闭它。
using(StreamReader sr = new StreamReader(@"C:\abc.txt"))
{
// ...
}
File.WriteAllLines(...);
File.WriteAllLines
还将所有行写入文件,而不仅仅是currrent行,因此在循环中执行它是没有意义的。
我可以建议您使用不同的方法来读取文本文件的行吗?您可以使用File.ReadAllLines
将所有行读入string[]
或File.ReadLines
,其行为与StreamReader
类似,通过懒惰读取所有行。
这是一个版本做同样但使用(更可读的?)LINQ查询的版本:
var lines = File.ReadLines(@"C:\abc.txt")
.Where(l => l.StartsWith("<") && l.IndexOf('{') == 29)
.Select(l =>
{
int start = l.IndexOf("{");
int end = l.IndexOf("}", start);
string result = l.Substring(start + 1, end - start - 1);
Guid g = Guid.NewGuid();
return l.Replace(result, g.ToString());
}).ToList();
File.WriteAllLines(@"C:\abc.txt", lines);
答案 2 :(得分:0)
问题是您在该文件中写入的同时打开了文件并从同一文件中读取。但你应该做的是,
所以你的代码应该像
List<string> myAppendedList = new List<string>();
using (StreamReader sr = new StreamReader(@"C:\abc.txt"))
{
string line;
line = sr.ReadLine();
while (line != null)
{
if (line.StartsWith("<"))
{
if (line.IndexOf('{') == 29)
{
string s = line;
int start = s.IndexOf("{");
int end = s.IndexOf("}");
string result = s.Substring(start + 1, end - start - 1);
Guid g = Guid.NewGuid();
line = line.Replace(result, g.ToString());
myAppendedList.Add(line);
}
}
Console.WriteLine(line);
line = sr.ReadLine();
}
}
if(myAppendedList.Count > 0 )
File.WriteAllLines(@"C:\abc.txt", myAppendedList);