2012-01-03 4 views
1

텍스트 파일을 읽는 파서의 진행 상황을 표시하는 진행률 표시 줄을 만들려고합니다.파일 크기가 바이트 단위로 모든 줄의 합계 바이트 크기와 같지 않은 이유는 무엇입니까?

내가 fileSize = FileInfo(file).Length 모든 반복에를 사용하여 파일의 바이트를 읽고, 그렇게하기 위해, 나는 내가 완성 읽고있을 때 가정

sum += reader.CurrentEncoding.GetByteCount(currentLine)

사용하여 현재 행의 바이트 합계 전체 파일 sumfileSize과 같아야합니다.

하지만 그렇지 않습니다. sum은 항상 fileSize보다 수천 바이트 낮습니다. 왜 이런거야? 이미 구문 분석 한 파일의 수를 표시하는 진행률을 올바르게 만들려면 어떻게해야합니까?

+1

누락 된 바이트 수는 파일의 줄 수와 같거나 그 이상입니까? –

+1

아마도 reader.CurrectEncoding.GetByteCount는 캐리지 리턴/줄 피드백 문자를 계산하지 않습니까? – Arne

+1

당신은 개행 문자의 바이트 수를 계산하고 있습니까? – Rotem

답변

4

인코딩이 원인 일 수있는 이유는 여러 가지가있을 수 있습니다. 나는 UTF-8 인코딩이나 이와 비슷한 것들에 대해서 이야기하는 것이 아니라 라인 엔딩에 대해서도 말하고있다.

예를 들어, 텍스트 파일이 두 단어로 두 줄을 포함 할 수 있습니다 :

Hello 
World 

을 각 라인의 바로 바이트를 계산하면 10 바이트 (5 자 각)로 끝날 것입니다. 그러나 파일 인코딩에 따라 행 길이에 포함되지 않은 \r, \r\n 또는 \n으로 표시된 행 끝이 생깁니다.

파일 크기에 따라 전체 파일을 String[]으로 읽거나 대신 스트림의 현재 위치를 진행률 표시기로 사용할 수 있습니다.

8

ReadLine()은 줄 끝을 제거합니다. 일반적으로 CR + LF이지만 불행히도 텍스트 파일에는 다른 규칙 (LF 만)이 있습니다.

난 당신이 줄 바꿈이 당신의 데이터가 무엇인지 발견하고 바로 아이폰에, 인코딩 귀찮게 할 필요를 추가 할 수 있습니다 가정 :

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

currentLine가 마지막에 개행 문자를 포함하는 것이 있습니까? 수행 할 작업

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

'Environment.NewLine'에는'\ r \ n' 또는 단순히'\ n'가 포함될 수 있기 때문에 모든 경우에 작동하지는 않습니다. 그러나 이것이 파일이 동일한 인코딩을 사용한다는 것을 의미하지는 않습니다 (예 : Unix 시스템에서 생성되었을 수도 있음). – Mario

0

파일 시스템의 모든 파일에도 권한, 타임 스탬프 등과 같은 메타 데이터가있는 헤더가 있기 때문입니다. 또한 줄 바꿈, 줄 끝, 파일 끝과 같은 특수 문자는 고려하지 않았습니다. 걱정하지 마십시오. 진행 막대 또는 FileInfo가 정확하지 않은 경우 정확한 줄을 원하면 줄의 합을 사용하십시오.

+0

메타 데이터는 파일 크기에 포함되지 않으며 별도로 저장됩니다. 파일의 끝과 파일 끝은 옳습니다. –

관련 문제