我有一个简单的日志文本文件,扩展名为.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
答案 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);
}
}