2015-10-26 60 views
1

我有一個Filestream和我正在閱讀一個文件。文件流和CRLF分隔符?

分隔符是CRLF,我想直到CRLF纔讀。

如何使用Filestream來做到這一點? 是Filestream哪怕是正確的選擇?

我不喜歡readallLines或類似的方法,你必須將所有文件加載到內存中。

主要優先級是內存效率。

+1

'File.ReadLines()'不閱讀所有的文件等等'File.ReadLines(@ 'C:\ MyFile.txt的')。以( 1)'可能是一個解決方案; (注意'ReadAllLines'和'ReadLines'之間的區別) –

回答

1

您的評論戲劇性地改變了問題;所以你有一個打開FileStream,你想找到下一個CRLF ('\r\n')在它;在這種情況下,類似的東西可以實現:

private static long GetNextCRLFPosition(FileStream stream) { 
    try { 
     long savedPosition = fs.Position; 

     // ReadByte - we're working with binary file... 
     for (int item = fs.ReadByte(); item >= 0; item = fs.ReadByte()) { 
     if (item == '\r') { 
      item = fs.ReadByte(); 

      if (item == '\n') 
      return fs.Position - 2; 
      else 
      fs.Seek(-1, SeekOrigin.Current); 
     } 
     }  

     return -1; 
    } 
    finally { 
     fs.Seek(savedPosition, SeekOrigin.Begin); 
    } 
    } 

    ... 

    using (FileStream fs = new FileStream(@"C:\MyFile.Text", FileMode.Open)) { 
    ... 
    // The next "\r\n" is in shift bytes 
    long shift = GetNextCRLFPosition(fs);  
    ... 
    } 
+0

我的問題是我所謂的二進制文件包含很多「文本」,所以我必須在'FileStream'和'StreamReader'之間進行交換。如果我從StreamReader讀取'ReadLines',我是否也改變'FileStream'的位置? SomeHow我不能得到那個工作。 – RayOldProf

+0

@RayOldProf StreamReader似乎只是一個圍繞FileStream的層,只是使用它的[FileStream] Position屬性。所以他們的位置是連接的。 – Vlad

+0

我剛剛發現並不那麼簡單。 'StreamReader'使用一些'buffer',它的位置不等於'FileStream'。因此我不能使用StreamReader。任何選擇? – RayOldProf