调整TextFile的大小(保留X行的第一行并删除其余行)

时间:2013-05-20 17:41:22

标签: .net vb.net text text-files lines

我正在尝试删除文本文件中“X”行后面的所有行,我的意思是保留第一行“X”行并删除其余行。

我知道如何通过这种方式做到这一点:

1. Open the textfile
2. Read line by line
3. Count the line number.
4. Store the line content and append the string in the new textfile
5. Continue reading the next line and doing the same (step 3 & 4).
6. When line-count reaches "X" then stop reading lines.

执行此操作的步骤太多且方法很慢,有人知道更好的(快速)方法来保留文本文件的前1.000行并删除其余行吗?

Private Sub Resize_LogFile()
    If File.ReadAllLines(LogFile).Length > 1000 Then
        ' Delete all the lines after line number: 1.000
        ' Save it
    End If
End Sub

3 个答案:

答案 0 :(得分:1)

如果要编辑文件,请先读取X行,找出第X行末尾的位置,然后截断该位置的文件。此解决方案永远不会有多于一行引用的文件,因此不会为更大的文件占用更多内存。但是,更大的文件需要更多的时间。

Using fs As New FileStream(Logfile, FileMode.Open)
    Using sr As New StreamReader(fs)
        For i As Integer = 1 To X
            sr.ReadLine() 'Read X lines
        Next
    End Using
    fs.SetLength(fs.Position) 'Remove all following text
End Using

如果您想使用新文件,那么由于行结尾的位置不可预测,您的算法是最好的。

答案 1 :(得分:1)

以下代码对我有用:

    Using fs As New FileStream(fileName, FileMode.Open)
        Dim pos As Long = 0

        Using sr As New StreamReader(fs)
            For i As Integer = 1 To maxNumOfLines
                Dim line As String = sr.ReadLine()
                pos += line.Length + 2
            Next

            fs.SetLength(pos - 2)
        End Using
    End Using

答案 2 :(得分:0)

找到了这个并进行了一些修改,我认为这是一个更好(最快)的解决方案:

不需要“For”,所以应用程序中没有挂起,我很高兴:)

Private Sub Resize_LogFile()
    Dim MaxLogEntries As Int32 = 1000
    Dim MinLogEntries As Int32 = 500
    If File.ReadAllLines(LogFile).Length > MaxLogEntries Then

        Dim strArray() As String = File.ReadAllLines(LogFile)
        Array.Reverse(strArray)
        ReDim Preserve strArray(MinLogEntries)
        Array.Reverse(strArray)
        Using WriteLogFile As New IO.StreamWriter(LogFile, False, Encoding.Default) : WriteLogFile.WriteLine(String.Join(vbNewLine, strArray)) : End Using

    End If
End Sub