2012-01-19 2 views
1

동영상 (MKV)과 크기가 7GB 인 경우 어떻게 FileStream에서 읽을 수 있습니까? int의 최대 크기는 약 2,147입니다. 메가 바이트 .. 인덱스 3G.B에서 읽기 시작하는 방법. FileStream의 .Read() 메소드는 3GB가 int 범위 밖의 정수로 오프셋을 취하기 때문에 .. ???FileStream을 사용하여 2GB 이상의 큰 파일을 읽는 방법

private void readingLargeFile(string path) 
{ 
    int start = 3*(1024*1024*1024); 

    FileStream fs = new FileStream(path,FileMode.Open); 
    fs.Read(data, start, (1024*8)); 
} 

답변

9

읽기는 생각대로하지 않습니다.

Read

오프셋이 데이터를 쓰기 시작하는 시점의 버퍼의 선두로부터의 오프셋 (offset), 이것은 읽기를 시작하는 시점의 파일 오프셋되지 않는다. 이미 부분적으로 버퍼를 채워 한 당신은 좀 더에 압정하려면

그것은 단지 일반적으로 비 제로는 다음과 같습니다

fs.Read (data, 0, 8); // Put first 8 bytes of file at buffer start 
fs.Read (data, 16, 8); // Put next 8 bytes of file at buffer end 
fs.Read (data, 8, 8); // Put first 8 bytes of file at buffer middle 

그 예로, aaaaaaaabbbbbbbbcccccccc가 포함 된 파일은 버퍼에 끝날 것 로 :

aaaaaaaaccccccccbbbbbbbb 

먼저 추구해야하고, 그것을 아주 쉽게 8G 파일을 처리 할 수 ​​있어야합니다 그래서 오프셋 값으로 long을 사용합니다. 이런 식으로 뭔가 좋은 출발점이 될 것입니다 :

private void readingLargeFile (string path) { 
    long start = 3L * 1024L * 1024L * 1024L; 

    FileStream fs = new FileStream (path, FileMode.Open); 
    fs.Seek (start, SeekOrigin.Begin) 
    fs.Read (data, 0, 8 * 1024); 
} 

(이 읽기 및/또는 개방 모드와 기능 당신이 전화에 따라 쓸 것) 파일의 현재 위치에 Seek 변경됩니다.

그래서 fs.Seek (start, SeekOrigin.Begin)은 파일 포인터를 파일의 시작 부분에서 start 자로 설정합니다. SeekOrigin.Begin 이외의 다른 이동 방법을 지정하여 앞으로 27 바이트와 같은 현재 위치에서 찾거나 파일의 끝에서 검색 할 수 있습니다.

전체 세부 사항은 SeekRead에 대해 MSDN에서 사용할 수 있습니다.

+0

고마워요. PAXDIABLO ..하지만 내게 설명 할 수있는 fs.Seek (시작, SeekOrigin.Begin) 않습니다! –

+1

문제 없음, @ MurHafSoz - 관련 MSDN 설명서에 대한 설명과 링크를 추가했습니다. – paxdiablo

관련 문제