4

对于我正在做的一个项目,我必须做的一件事就是删除一个纯文本文件的前X行。我说X是因为我需要多次执行此例程,每次删除的行都会不同,但它们总是从头开始,删除第一个X,然后将结果输出到同一个文件。

我正在考虑做这样的事情,我从阅读的其他教程和示例中拼凑而成:

String line = null;

String tempFile = Path.GetTempFileName();
String filePath = openFileDialog.FileName;

int line_number = 0;
int lines_to_delete = 25;

using (StreamReader reader = new StreamReader(originalFile)) {
    using (StreamWriter writer = new StreamWriter(tempFile)) {
        while ((line = reader.ReadLine()) != null) {
            line_number++;

            if (line_number <= lines_to_delete)
                continue;

            writer.WriteLine(line);
        }
    }
}

if (File.Exists(tempFile)) {
    File.Delete(originalFile);
    File.Move(tempFile, originalFile);
}

但是我不知道这是否会起作用,因为像从第 0 行开始的行号之类的小东西或者诸如此类的东西......另外,我不知道它在效率和形式方面是否是好的代码。

谢谢一堆。

4

4 回答 4

10

我喜欢短...

File.WriteAllLines(
    fileName,
    File.ReadAllLines(fileName).Skip(numberLinesToSkip).ToArray());
于 2009-10-03T23:26:29.950 回答
6

没关系,看起来它不会有你担心的问题。然而,两个单独的循环将提供一种更精简的方法——一个只计算输入文件中的前 X 行(不做任何其他事情),一个单独的循环只是将其他行从输入复制到输出。即,而不是你的单循环while,有...:

    while ((line = reader.ReadLine()) != null) {
        line_number++;

        if (line_number > lines_to_delete)
            break;
    }

    while ((line = reader.ReadLine()) != null) {
        writer.WriteLine(line);
    }
于 2009-10-03T23:17:50.390 回答
2

我喜欢你的方法,我看不出有什么问题。如果您确定它们是小文件,那么如果这对您很重要,那么其他建议可能会少一些代码。

您已经拥有的稍微不那么冗长的版本:

using (StreamReader reader = new StreamReader(originalFile))
using (StreamWriter writer = new StreamWriter(tempFile))
{
    while(lines_to_delete-- > 0)
        reader.ReadLine();
    while ((line = reader.ReadLine()) != null)
        writer.WriteLine(line);
}
于 2009-10-04T00:09:50.783 回答
0

您可以将文件读入一个行数组,忽略前几个元素,然后将其余元素写回。

这种方法的缺点是它会消耗内存中文件的大小。你的方法(虽然很不可读,没有冒犯)没有这个内存问题。尽管如果文件不是太大,则不必担心内存使用情况。

例子:

string[] lines = System.IO.File.ReadAllLines("YourFile.txt").Skip(10).ToArray();
System.IO.File.WriteAllLines("OutFile.txt", lines);
于 2009-10-03T23:18:11.653 回答