2016-04-06 17 views
2
long bytesread = 0; 
FileInfo f = new FileInfo(ficheiroaEnviar); 
tamanhoFicheiroEnviar = f.Length; 
byte[] chunkFicheiro; 
while (!tudoFeito) 
{ 
    long oQueFalta = (tamanhoFicheiroEnviar - bytesread); 

    if (oQueFalta < tamanhoChunkPredefenido) 
    { 
     chunkFicheiro = new byte[tamanhoChunkPredefenido]; 
    } 
    else 
    { 
     chunkFicheiro = new byte[oQueFalta]; 
    } 

    using (FileStream fsSource = new FileStream(ficheiroaEnviar, FileMode.Open, FileAccess.Read)) 
    { 
     lock (fsSource) 
     { 
      fsSource.Seek(bytesread, SeekOrigin.Begin); 
      fsSource.Read(chunkFicheiro, bytesread, chunkFicheiro.Length); 
     } 
    } 
    bytesread += chunkFicheiro.Length; 
} 

Bir 10GB dosya parçasını parça parçadan okuyabilmeyi isterim? Bir tamsayı maksimum sayısı 2,147,483,647 ve 10 GB’nin 10 000 000 000 baytı vardır. Büyük dosyalar ile çalışabilmesi için bir offset stream.read (diğer, int ofset, diğer) nasıl kullanabilirim?Stream.read'de bir offset kadar uzun bir süre nasıl geçilir?

(düzenleme soru veya dilerseniz başlık)

+2

[FileStream.Seek] ilk parametresi (https://msdn.microsoft.com/en-us/library/system.io.filestream.seek (v = vs.110) .aspx) bir Int64'dür . Kodunuz çalışmalıdır (en azından Arayan arama ile ilgili her şey için) – Steve

+0

Ben fsSource.Read (chunkFicheiro, bytesread, chunkFicheiro.Length) hakkında konuşuyorum; 'bytesread, eğer bir 10 GB dosyası kullanıyorum daha büyük olması gerekiyor daha sonra bir ** int ** – meme

+0

Meme Kaynak akışında değil, _destination_ dizisinde kullanılacak ofset budur. Bir dizi, int'den büyük olamaz, MaxValue', bundan daha büyük bir ofset elde etmenin bir anlamı yoktur. –

cevap

3

okuma işleminde ofset değeri okuma işlemi için hedef dizide kaydırılmıştır. Bir fileStream'den okurken, konum siz okuduğunuz gibi artacaktır. System.Int32 okuma bayt yerleştirileceği de dizide ofset bayt:

https://msdn.microsoft.com/en-us/library/system.io.filestream.read(v=vs.110).aspx Tipi ofset.

Sizin (gerekli arı olmamalıdır rağmen) akışı ilerleyeceğine arama işlemi

Eğer chunkFicheiro dizide farklı bir dizinde yerleştirmek için istemedikçe ofset için 0 kullanmalıdır Okunmuş

//Example of reading the file from the stream 
do 
{ 
    bytesRead = fsSource.Read(chunkFicheiro, 0, chunkFicheiro.Length); 
    //Do something with the chunk if bytesRead > 0 
} while (bytesRead > 0); 
İlgili konular