C# 剪切并粘贴文本文件c中的文本行#

C# 剪切并粘贴文本文件c中的文本行#,c#,C#,大家好,这里是初学者,我正在用C#编写一个程序,希望能给大家一些建议。我需要能够打开一个文本文档,读取第一行文本(不是空的),将这行文本保存到另一个文本文档中,最后用空行覆盖读取的行 这就是我到目前为止所做的,一切正常,直到最后一部分,我需要在原始文本文档中写一个空行,我只得到一个完整的空白文档。正如我上面提到的,我是C#的新手,因此我确信有一个简单的解决方案,但我无法找到它,感谢您的帮助: try { StreamReader sr =

大家好,这里是初学者,我正在用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();
试试看
{
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可以用于阅读全文文档,但仅用于阅读第一行,我该怎么做?