如何删除文本文件中的最后一行?

时间:2010-11-24 06:43:37

标签: c# line

我有一个简单的日志文本文件,扩展名为.txt,每次从第三方程序生成日志文件时,该文本文件末尾都有一个空白行。

因此,我可以使用任何方法或代码来删除文本文件的最后一行吗?

日志文本文件的示例:

Sun Jul 22 2001 02:37:46,73882,...b,r/rrwxrwxrwx,0,0,516-128-3,C:/WINDOWS/Help/digiras.chm
Sun Jul 22 2001 02:44:18,10483,...b,r/rrwxrwxrwx,0,0,480-128-3,C:/WINDOWS/Help/cyycoins.chm
Sun Jul 22 2001 02:45:32,10743,...b,r/rrwxrwxrwx,0,0,482-128-3,C:/WINDOWS/Help/cyzcoins.chm
Sun Jul 22 2001 04:26:14,174020,...b,r/rrwxrwxrwx,0,0,798-128-3,C:/WINDOWS/system32/spool/drivers/color/kodak_dc.icm

6 个答案:

答案 0 :(得分:20)

如下:

var lines = System.IO.File.ReadAllLines("...");
System.IO.File.WriteAllLines("...", lines.Take(lines.Length - 1).ToArray());

说明:

从技术上讲,您不会从文件中删除一行。您阅读文件的内容并将其写回,不包括您要删除的内容。

此代码执行的操作是将所有行读入数组,并将这些行写回文件,仅排除最后一行。 (Take()方法(LINQ的一部分)采用指定的行数,在我们的例子中,长度为1)。在此,var lines可以理解为String[] lines

答案 1 :(得分:10)

使用此方法删除文件的最后一行:

public static void DeleteLastLine(string filepath)
{
    List<string> lines = File.ReadAllLines(filepath).ToList();

    File.WriteAllLines(filepath, lines.GetRange(0, lines.Count - 1).ToArray());

}

编辑:实现了之前不存在的行变量,所以我更新了代码。

答案 2 :(得分:3)

如果您要删除文件中的最后N行而不将所有内容全部加载到内存中

int numLastLinesToIgnore = 10;
string line = null;
Queue<string> deferredLines = new Queue<string>();
using (TextReader inputReader = new StreamReader(inputStream))
using (TextWriter outputReader = new StreamWriter(outputStream))
{
    while ((line = inputReader.ReadLine()) != null)
    {
        if (deferredLines.Count() == numLastLinesToIgnore)
        {
            outputReader.WriteLine(deferredLines.Dequeue());
        }

        deferredLines.Enqueue(line);
    }
    // At this point, lines still in Queue get lost and won't be written
}

当您使用维度numLastLinesToIgnore缓存队列中的每个新行时,会弹出一行,只有在队列已满时才会写入。您实际上预读该文件,并且您可以在文件结束之前停止numLastLinesToIgnore行,不知道提前的总行数

请注意,如果文字小于numLastLinesToIgnore,则结果为空。

我想出了它作为镜像解决方案: Delete specific line from a text file?

答案 3 :(得分:3)

您无法删除行结束,因为File.WriteAllLines会自动添加它,但是,您可以使用此方法:

public static void WriteAllLinesBetter(string path, params string[] lines)
{
    if (path == null)
        throw new ArgumentNullException("path");
    if (lines == null)
        throw new ArgumentNullException("lines");

    using (var stream = File.OpenWrite(path))
    using (StreamWriter writer = new StreamWriter(stream))
    {
        if (lines.Length > 0)
        {
            for (int i = 0; i < lines.Length - 1; i++)
            {
                writer.WriteLine(lines[i]);
            }
            writer.Write(lines[lines.Length - 1]);
        }
    }
}

这不是我的,我在.NET File.WriteAllLines leaves empty line at the end of file

找到了它

答案 4 :(得分:1)

我只是从其他网站上找到了解决方案,这是网址https://stackoverrun.com/cn/q/627722

使用少量的行,您可以轻松地使用类似的内容

string filename = @"C:\Temp\junk.txt";
string[] lines = File.ReadAllLines(filename);

但是,随着文件变大,您可能需要使用类似的方法将数据流进出流

string filename = @"C:\Temp\junk.txt";
string tempfile = @"C:\Temp\junk_temp.txt";

using (StreamReader reader = new StreamReader(filename))
{                
       using (StreamWriter writer = new StreamWriter(tempfile))
       {
           string line = reader.ReadLine();

           while (!reader.EndOfStream)
           {
               writer.WriteLine(line);
               line = reader.ReadLine();
           } // by reading ahead, will not write last line to file
       }
}

File.Delete(filename);
File.Move(tempfile, filename);

答案 5 :(得分:0)

那应该是使用大文件的最佳选择。

using (StreamReader source = new StreamReader(sourceFileName))
        {
            using (StreamWriter sw = new StreamWriter(newFileName))
            {
                do
                {

                    line = source.ReadLine();

                    if (source.Peek() > -1)
                    {
                        sw.WriteLine(line);
                    }
                    else
                    {
                        File.AppendAllText("RemovedLastLine.txt", line);
                    }

                }
                while (line != null);
            }
        }