private void StartWrite() { // var threadName = Thread.CurrentThread.Name ?? "Main"; //Console.WriteLine($"{threadName} start"); using (var destinationStream = new FileStream(DestinationFileName, FileMode.Create, FileAccess.Write)) { try { while (true) { var task = QueueToWrite.Dequeue(); if (task == null) { break; } if (task.RethrowException != null) { throw new Exception(task.RethrowException); } //Console.WriteLine($"{threadName} writing {task.UncompressedOffset}"); destinationStream.Seek(task.UncompressedOffset, SeekOrigin.Begin); destinationStream.Write(task.Buffer, 0, task.Buffer.Length); ExecutionStatus.IncrementStatus(); } } catch (Exception ex) { destinationStream.Flush(false); throw new Exception(ex.Message); } } //Console.WriteLine($"{threadName} end"); }
private void StartReadAndCompress() { //var threadName = Thread.CurrentThread.Name ?? ""; //Console.WriteLine($"{threadName} start"); using (var sourceStream = new FileStream(SourceFileName, FileMode.Open, FileAccess.Read, FileShare.Read)) { try { var maxPosition = sourceStream.Length; byte[] buffer = new byte[Settings.ChunkSizeBytes]; while (true) { var currentPosition = PositionToRead.GetLastPositionAndIncrement(); if (currentPosition < 0) { break; } //Console.WriteLine($"{threadName} processing {currentPosition}"); var chunkSize = (int)Math.Min(Settings.ChunkSizeBytes, maxPosition - currentPosition); sourceStream.Seek(currentPosition, SeekOrigin.Begin); sourceStream.Read(buffer, 0, chunkSize); using (MemoryStream ms = new MemoryStream()) { using (GZipStream gs = new GZipStream(ms, CompressionMode.Compress)) gs.Write(buffer, 0, chunkSize); QueueToWrite.Enqueue(new Task(currentPosition, ms.ToArray())); } } } catch (OutOfMemoryException) { QueueToWrite.Enqueue(new Task("There is no enough memory to continue")); } catch (Exception ex) { QueueToWrite.Enqueue(new Task(ex.Message)); } finally { QueueToWrite.FinishEnqueue(); } } //Console.WriteLine($"{threadName} end"); }
private void StartReadAndDecompress() { //var threadName = Thread.CurrentThread.Name ?? "Main"; //Console.WriteLine($"{threadName} start"); using (var sourceStream = new FileStream(SourceFileName, FileMode.Open, FileAccess.Read, FileShare.Read)) { try { while (true) { var currentPosition = (int)PositionToRead.GetLastPositionAndIncrement(); if (currentPosition < 0) { break; } var chunk = Metadata.ChunkList[currentPosition]; //Console.WriteLine($"{threadName} processing {chunk.CompressedOffset}"); sourceStream.Seek(chunk.CompressedOffset, SeekOrigin.Begin); using (MemoryStream ms = new MemoryStream()) { using (GZipStream gs = new GZipStream(sourceStream, CompressionMode.Decompress, true)) gs.CopyTo(ms, Settings.ChunkSizeBytes); QueueToWrite.Enqueue(new Task(chunk.UncompressedOffset, ms.ToArray())); } } } catch (Exception ex) { QueueToWrite.Enqueue(new Task(ex.Message)); } finally { QueueToWrite.FinishEnqueue(); } } //Console.WriteLine($"{threadName} end"); }