2012-01-19 55 views
1

如果我有一部電影(MKV)並且它的大小像7 GB,我如何在FileStream中讀取它.. 我們知道int的最大大小約爲2,147 MB ..如何從索引3G.B開始讀取,因爲FileStream中的.Read()方法將偏移量作爲3 GB超出整數範圍的整數。如何使用FileStream讀取大於2 GB的大文件

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偏移是從緩衝器在開始寫入的數據的起始位置的偏移,它不中文件在開始讀取的偏移量。

這只是通常非零值,如果你已經部分填充的緩衝區,要釘在多一點:

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 

您需要先求,以及使用long作爲偏移值,所以它應該能夠很容易地處理8G的文件。這樣的事情會是一個很好的起點:

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字符從文件的開頭。您也可以指定其他的移動方法,比如從當前位置尋找27個字節的向前尋找,或者從文件末尾尋找。

有關SeekRead的詳細信息,均可在MSDN上獲得。

+0

非常感謝PAXDIABLO先生..但你可以向我解釋什麼fs.Seek(start,SeekOrigin.Begin)呢! –

+1

沒有問題,@MurHafSoz - 我添加了一些解釋和指向相關MSDN文檔的鏈接。 – paxdiablo

相關問題