private InputStream ReadStream(int streamIndex, MemoryMappedFile memoryMappedFile, long offset, long size) { int chunkSize = _settings.ChunkSize; int chunkIndex = 0; InputStream inputStream = new InputStream(streamIndex); while (size > 0) { if (size < chunkSize) { chunkSize = (int)size; } IStreamChunk inputStreamChunk = new MemoryMappedFileChunk(chunkIndex, memoryMappedFile, offset, chunkSize); inputStream.Chunks.Add(inputStreamChunk); chunkIndex++; offset += chunkSize; size -= chunkSize; } return(inputStream); }
public IEnumerable <InputStream> Read(string fileName, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(fileName)) { throw new ArgumentException("Input file name must be non-empty"); } List <InputStream> inputStreams = new List <InputStream>(); FileInfo fileInfo = new FileInfo(fileName); long size = fileInfo.Length; int chunkSize = _settings.ChunkSize; if (size < chunkSize) { InputStream inputStream = new InputStream(0); IStreamChunk inputStreamChunk = new StreamChunk(0, fileInfo.Open(FileMode.Open)); inputStream.Chunks.Add(inputStreamChunk); inputStreams.Add(inputStream); } else { long offset = 0; long streamsCount = _settings.StreamsCount; long chunksCount = size / (streamsCount * chunkSize); if (chunksCount == 0) { throw new CompressionException("Streams count or chunk size are too big"); } int chunkIndex = 0; InputStream inputStream = new InputStream(0); MemoryMappedFile memoryMappedFile = MemoryMappedFile.CreateFromFile(fileName); while (size > 0) { if (cancellationToken.IsCancellationRequested) { break; } if (size < chunkSize) { chunkSize = (int)size; } IStreamChunk inputStreamChunk = new MemoryMappedFileChunk(chunkIndex, memoryMappedFile, offset, chunkSize); inputStream.Chunks.Add(inputStreamChunk); chunkIndex++; offset += chunkSize; size -= chunkSize; if (chunkIndex > chunksCount && size > chunkSize) { chunkIndex = 0; inputStreams.Add(inputStream); inputStream = new InputStream(inputStreams.Count); } } inputStreams.Add(inputStream); } return(inputStreams); }