簡體   English   中英

FileInfo.Length!=所有行長度的總和

[英]FileInfo.Length != sum of all line length

我正在嘗試為大文件閱讀制作進度條。 我將進度條的最大值設置為FileInfo.Length ,我使用StreamReader.ReadLine讀取每一行並計算每個行長度的總和(使用String.Length )來設置進度條的當前值。

我注意到文件的總長度和每行的長度之和存在差異。 例如: FileInfo.Length = 25577646所有行長度的總和= 25510563

為什么會有這樣的差異?

謝謝你的幫助 !

您沒有添加行尾。 它可以是從1到4個字節,這取決於編碼,或者如果它是一個\\n\\r\\r\\n (1個字節= UTF8 + \\n ,4個字節= UTF16 + \\r\\n

請注意,使用ReadLine ,無法檢查哪個行尾( \\n\\r\\r\\n遇到它)

來自ReadLine

一行被定義為一個字符序列,后跟一個換行符(“\\ n”),一個回車符(“\\ r”),或一個回車符后面緊跟一個換行符(“\\ r \\ n”)

其他問題:如果你的文件是UTF8,那么C#char長度與字節長度不同: è是C#中的一個char(使用UTF16),UTF8中有2個字符。 你可以:

int len = Encoding.UTF8.GetByteCount(line);

這里有兩個問題:

  • string.Length為您提供每個字符串中的字符數,而FileInfo.Length為您提供字節數 這些可能是非常不同的東西,取決於使用的字符和編碼
  • 您沒有包含換行符(通常為\\n\\r\\n ),因為在使用TextReader.ReadLine讀取行時會刪除換行符

關於如何做到這一點......

  • 您可能知道文件的編碼,因此您可以通過調用Encoding.GetBytes將每行重新轉換為字節來解釋該差異。 盡管這樣做會非常浪費。
  • 如果您知道文件使用的換行符,則可以為您讀取的每一行添加相關的字節數
  • 您可以保留對基礎流的引用,並使用Stream.Position來檢測您實際讀取的文件的距離。 這不一定與您處理的數據量相同,因為StreamReader將具有緩沖區。 (因此,即使您尚未處理所有行,您也可以“看到” Stream已讀取所有數據。)

最后一個想法可能是最干凈的IMO。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM