C# 剪切并粘贴文本文件c中的文本行#
大家好,这里是初学者,我正在用C#编写一个程序,希望能给大家一些建议。我需要能够打开一个文本文档,读取第一行文本(不是空的),将这行文本保存到另一个文本文档中,最后用空行覆盖读取的行 这就是我到目前为止所做的,一切正常,直到最后一部分,我需要在原始文本文档中写一个空行,我只得到一个完整的空白文档。正如我上面提到的,我是C#的新手,因此我确信有一个简单的解决方案,但我无法找到它,感谢您的帮助:C# 剪切并粘贴文本文件c中的文本行#,c#,C#,大家好,这里是初学者,我正在用C#编写一个程序,希望能给大家一些建议。我需要能够打开一个文本文档,读取第一行文本(不是空的),将这行文本保存到另一个文本文档中,最后用空行覆盖读取的行 这就是我到目前为止所做的,一切正常,直到最后一部分,我需要在原始文本文档中写一个空行,我只得到一个完整的空白文档。正如我上面提到的,我是C#的新手,因此我确信有一个简单的解决方案,但我无法找到它,感谢您的帮助: try { StreamReader sr =
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();
试试看
{
StreamReader sr=新的StreamReader(@“C:\Users\Stephen\Desktop\Sample.txt”);
line=sr.ReadLine();
而(行==“”)
{
line=sr.ReadLine();
}
高级关闭();
字符串路径=(@“C:\Users\Stephen\Desktop\new.txt”);
如果(!File.Exists(path))
{
File.Create(path.Dispose();
TextWriter tw=新的StreamWriter(路径);
tw.WriteLine(行);
tw.Close();
}
else if(File.Exists(path))
{
TextWriter tw=新的StreamWriter(路径,true);
tw.WriteLine(行);
tw.Close();
}
StreamWriter sw=新StreamWriter(@“C:\Users\Stephen\Desktop\Sample.txt”);
int cnt1=0;
而(cnt1<1)
{
西南书写线(“”);
cnt1=1;
}
sw.Close();
}
捕获(例外e)
{
Console.WriteLine(“异常:+e.Message”);
}
最后
{
WriteLine(“最终执行块”);
}
其他的
Console.WriteLine(“未安装程序”);
Console.ReadLine();
请参见:
将true
添加到StreamWriter
构造函数以将其设置为“追加”模式。请注意,这会在文档底部添加一行,因此您可能需要在顶部插入或覆盖它
请参阅:
显然,仅仅插入或覆盖一行并不是那么容易,通常的方法是在替换所需行的同时复制所有行,并将每一行写回文件。不幸的是,您必须经历重写文件的艰苦过程。在大多数情况下,您可以将其加载到内存中,然后执行以下操作:
string contents = File.ReadAllText(oldFile);
contents = contents.Replace("bad line!", "good line!");
File.WriteAllText(newFile, contents);
请记住,您必须在这里处理换行的概念,因为string.Replace
并不是天生只关注整行。但这当然是可行的。您也可以使用带有该方法的正则表达式。您还可以使用File.ReadAllLines(string)
将每一行读入IEnumerable
,并在将它们写回新文件时对每一行进行测试。这取决于你到底想做什么,以及你想做得有多精确
using (var writer = new StreamWriter(newFile))
{
foreach (var line in File.ReadAllLines(oldFile))
{
if (shouldInsert(line))
writer.WriteLine(line);
}
}
当然,这取决于谓词shouldInsert
,但您可以根据需要修改它。但是,IEnumerable
的性质应该使资源相对较少。您还可以使用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);
}
}
当然,回想一下,这可能会在文件末尾留下额外的空行。我太累了,不能肯定地说我应该能够做到,但我很确定情况就是这样。如果这真的很重要的话,请注意这一点。当然,通常不会
综上所述,最好的方法是在不浪费内存的情况下享受一下乐趣,编写一个函数来读取
文件流
,并将适当的字节写入新文件。当然,这是最复杂和最可能的杀戮方式,但这将是一项有趣的任务 您可能想在这里稍微使用一下using
关键字。这并不能回答你的问题,我也不认为你错过了什么,但这是一个好习惯。很容易忘记关闭或处理对象,这可能是一个非常令人沮丧的错误。您正在覆盖行变量。尝试File.ReadAllLines,或在while循环中构建目标文件。正如@Matthew所说的,用一个木块将其包裹起来,以便于处理。您也不需要文件检查功能,StreamWriter可以选择覆盖现有文件。因此ReadAllText可以用于阅读全文文档,但仅用于阅读第一行,我该怎么做?