大家好初学者在这里寻找一些我用C#编写的程序的建议。我需要能够打开文本文档,读取第一行文本(不是空白),将此行文本保存到另一个文本文档,最后用空行覆盖读取行。
这是我到目前为止,一切正常,直到我需要在原始文本文档中写一个空行的最后一部分,我只是得到一个完整的空白文档。就像我上面提到的,我是C#的新手,所以我确信有一个简单的解决方案,但我无法弄明白,任何帮助表示赞赏:
try
{
StreamReader sr = new StreamReader(@"C:\Users\Stephen\Desktop\Sample.txt");
line = sr.ReadLine();
while (line == "")
{
line = sr.ReadLine();
}
sr.Close();
string path = (@"C:\Users\Stephen\Desktop\new.txt");
if (!File.Exists(path))
{
File.Create(path).Dispose();
TextWriter tw = new StreamWriter(path);
tw.WriteLine(line);
tw.Close();
}
else if (File.Exists(path))
{
TextWriter tw = new StreamWriter(path, true);
tw.WriteLine(line);
tw.Close();
}
StreamWriter sw = new StreamWriter(@"C:\Users\Stephen\Desktop\Sample.txt");
int cnt1 = 0;
while (cnt1 < 1)
{
sw.WriteLine("");
cnt1 = 1;
}
sw.Close();
}
catch (Exception e)
{
Console.WriteLine("Exception: " + e.Message);
}
finally
{
Console.WriteLine("Executing finally block.");
}
else
Console.WriteLine("Program Not Installed");
Console.ReadLine();
答案 0 :(得分:1)
不幸的是,您必须经历重写文件的艰苦过程。在大多数情况下,您可以将其加载到内存中,然后执行以下操作:
string contents = File.ReadAllText(oldFile);
contents = contents.Replace("bad line!", "good line!");
File.WriteAllText(newFile, contents);
请记住,你必须在这里处理换行的想法,因为string.Replace
并不是天生就只注意整行。但这当然可行。你也可以使用这种方法的正则表达式。您还可以使用File.ReadAllLines(string)
将每行读入IEnumerable<string>
并在将它们写回新文件时对每一行进行测试。这取决于你想要做什么以及你想要的准确程度。
using (var writer = new StreamWriter(newFile))
{
foreach (var line in File.ReadAllLines(oldFile))
{
if (shouldInsert(line))
writer.WriteLine(line);
}
}
当然,这取决于谓词shouldInsert
,但您可以根据自己的需要修改它。但IEnumerable<T>
的性质应该使资源相对较轻。您也可以使用StreamReader
获得较低级别的支持。
using (var writer = new StreamWriter(newFile))
using (var reader = new StreamReader(oldFile))
{
string line;
while ((line = reader.ReadLine()) != null)
{
if (shouldInsert(line))
writer.WriteLine(line);
}
}
回想一下,当然,这可能会在文件末尾留下额外的空行。我太累了,不能说我应该能够确定,但我很确定是这样的。如果真的很重要的话,请留意这一点。当然,它通常不会。
所有人都说,最好这样做的方法是通过编写一个函数来读取FileStream
in并获得一些乐趣并且不浪费内存写出适当的字节到你的新文件。当然,这是最复杂和可能过度杀戮的方式,但它是一项有趣的事业。
答案 1 :(得分:0)
请参阅:Append lines to a file using a StreamWriter
将true
添加到StreamWriter
构造函数以将其设置为“追加”模式。请注意,这会在文档的底部添加一行,因此您可能需要在顶部插入或覆盖它。
请参阅:Edit a specific Line of a Text File in C#
显然,插入或覆盖单行并不容易,通常的方法就是复制所有行,同时替换所需的行并将每行写回文件。