2012-01-03 69 views
1

我嘗試創建一個進度條來顯示分析器讀取文本文件的進度。爲什麼文件大小(字節)不等於每行的總和字節大小?

爲了做到這一點,我讀使用fileSize = FileInfo(file).Length並在每次迭代文件的字節,我使用

sum += reader.CurrentEncoding.GetByteCount(currentLine)

總結當前行的字節我認爲,當我讀完整個文件sum應該等於fileSize

但是,事實並非如此。 sum始終比fileSize低幾千字節。爲什麼是這樣?我怎樣才能正確創建一個進度,顯示已經解析了多少文件?

+1

是缺失的字節等於(或雙)的數量在文件中的行數,通過任何機會呢? – 2012-01-03 12:54:44

+1

也許讀者.CurrectEncoding.GetByteCount不計算回車/線反饋字符? – Arne 2012-01-03 12:55:17

+1

你在計算換行符的字節數嗎? – Rotem 2012-01-03 12:57:29

回答

4

可能有幾個原因,最有可能是由於編碼。我不是在談論像UTF-8編碼或類似的東西,而是線結尾。

例如,文本文件可能包含兩行用兩個詞:

Hello 
World 

計數每行只是個字節,你最終有10個字節(每5個字符)。但是,根據文件編碼的不同,它將具有標記爲\r\r\n\n的行結束,該行不包含在行的長度中。

根據您的文件大小,您可以將整個文件讀入String[],或者將流的當前位置用作進度指示器。

8

因爲ReadLine()將刪除行尾。通常CR + LF,但不幸的是還有其他的約定(只是LF)的文本文件。

我想你可以找到換行是在您的數據什麼,只是添加了lenght,沒有必要與編碼打擾:

sum += reader.CurrentEncoding.GetByteCount(currentLine) + 2; 
3

這是否currentLine在結尾換行字符?如果你這樣做

sum += reader.CurrentEncoding.GetByteCount(currentLine + Environment.NewLine); 
+1

這在所有情況下都不起作用,因爲'Environment.NewLine'可能包含'\ r \ n'或者簡單的'\ n'。但是,這並不意味着文件使用相同的編碼(例如,它可能是在Unix系統上創建的)。 – Mario 2012-01-03 12:56:32

0

這是因爲在文件系統中每個文件還與元數據,如權限,時間戳等你也沒有佔特殊字符,如換行,行結束符,文件末尾的標題。不要擔心,如果您想要精確處理進度條或FileInfo(如果不是真的話),請使用您的總和線。

+0

元數據不計入文件大小,它被單獨存儲。你是對的行尾和文件結束。 – 2012-01-03 13:40:44