2009-07-28 83 views
2

我想使用FileStream並從文件的開頭進行查找,同時向前移動文件大小.01%的文件。最有效的方式來跳過一個文件和讀取行?

所以我想在文件中尋找一個位置,閱讀整個行,如果它符合我的標準,我完成了。如果沒有,我會再向前看.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。

任何幫助,非常感謝!

+0

你的問題中提到想要在讀取只有1%的文件一段時間,但它也說你想逐行閱讀,所以我以這種方式回答了它。 – 2009-07-28 21:36:10

回答

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

什麼布特這樣的事情(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#開發)

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 
+0

感謝喬希,但文件是大的方式逐行通過它。我需要能夠在文件中找到一個位置。 – Doug 2009-07-28 23:06:21

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像THI使用S:

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 

(我花了一些調戲你的標準(假定固定寬度的值,而不是分隔),以使示例更容易)

+0

喬爾,我喜歡這個,但我應該指定我需要使用.NET 2.0。你的代碼是2.0嗎? – Doug 2009-07-28 23:07:13

+0

不,你需要3.5的lamdba函數和.Any()擴展名。但C#部分全部是2.0。給5分鐘,我會更新vb以使其兼容2.0。 – 2009-07-28 23:57:07

+0

另外,我應該警告你:該代碼直接輸入到回覆窗口中,並且完全未經測試。 – 2009-07-29 00:01:30

0

有一個example on MSDN

編輯迴應評論:

我必須承認我有點困惑,因爲你好像在使用緩衝的FileStream insistant,但想讀取文件在一個時間線?你可以簡單地使用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

相關問題