跳转文件和读取行的最有效方法?

时间:2009-07-28 21:16:39

标签: vb.net file-io .net-2.0

我想使用FileStream并在文件的开头搜索,同时在文件大小的文件大小中向前移动。

所以我想在文件中寻找一个位置,读取整行,如果符合我的标准,我就完成了。如果没有,我会向前寻找另一个.01。

C#没问题,但VB.NET更喜欢。

我曾经在VB6中做过类似的事情......

            FileOpen(1, CurrentFullPath, OpenMode.Input, OpenAccess.Read, OpenShare.Shared)
        Dim FileLength As Long = LOF(1)

        For x As Single = 0.99 To 0 Step -0.01
            Seek(1, CInt(FileLength * x))
            Dim S As String = LineInput(1)
            S = LineInput(1)
            filePosition = Seek(1)
            If filePosition < 50000 Then
                filePosition = 1
                Exit For
            End If
            V = Split(S, ",")
            Dim MessageTime As Date = CDate(V(3) & " " & Mid$(V(4), 1, 8))
            Dim Diff As Integer = DateDiff(DateInterval.Minute, MessageTime, CDate(RequestedStartTime))
            If Diff >= 2 Then
                Exit For
            End If
        Next

但我不想使用FileOpen,我想使用FileStream。

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:3)

这是对代码的或多或少直接转换,我们使用FileStream.Position指定文件中的读取位置:

Using streamReader As System.IO.StreamReader = System.IO.File.OpenText(CurrentFullPath)
  For x As Single = 0.99 To 0 Step -0.01
    streamReader.BaseStream.Position = CLng(streamReader.BaseStream.Length * x)
    Dim S As String = streamReader.ReadLine()
    '... etc.
  Next
End Using

答案 1 :(得分:1)

这样的事情(C#版本):

using (var file = System.IO.File.OpenText(filename))
{
     while (!file.EndOfStream)
     {
          string line = file.ReadLine();
          //do your logic here
          //Logical test - if true, then break
     }
}

编辑:VB版本(警告 - 来自C#dev!)

Using file as FileStream = File.OpenText(filename)
    while Not file.EndOfStream
         Dim line as string = file.ReadLine()
     ''//Test to break
     ''//exit while if condition met
    End While
End Using

答案 2 :(得分:0)

我通常更喜欢vb.net,但C#的迭代器块正在慢慢赢得我的支持:

public static IEnumerable<string> SkimFile(string FileName)
{
    long delta = new FileInfo(FileName).Length / 100;
    long position = 0;

    using (StreamReader sr = new StreamReader(FileName))
    {
        while (position < 100)
        {
            sr.BaseStream.Seek(position * delta, SeekOrigin.Begin);
            yield return sr.ReadLine();
            position++;
        }
    }
}

将它放在类库项目中并从vb中使用它:

Dim isMatch as Boolean = False
For Each s As String in SkimFile("FileName.txt")
    If (RequestedDate - CDate(s.SubString(3,11))).Minutes > 2 Then
       isMatch = True
       Exit For
    End If
Next s

(我对你的标准采取了一些自由(假设固定宽度值而不是分隔),以使示例更容易)

答案 3 :(得分:0)

example on MSDN

编辑以回应评论:

我必须承认我有点困惑,因为你似乎坚持使用缓冲的FileStream,但是想要一次读取一行文件?您可以使用StreamReader完成此操作。我不懂VB,但在C#中它会是这样的:

using (StreamReader sr = File.OpenText(pathToFile)) 
{
    string line = String.Empty;
    while ((line = sr.ReadLine()) != null) 
    {
        // process line
    }
}

请参阅http://msdn.microsoft.com/en-us/library/system.io.file.aspx