[英]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.