static private int StartProcessing(CompressionMode mode, string sourceFilePath, string targetFilePath) { NumberedQueue sourceBuffer = new NumberedQueue(_numberOfGzipThreads * 3); Reader reader = new Reader(sourceFilePath, sourceBuffer); Thread readingThread; switch (mode) { case CompressionMode.Compress: readingThread = new Thread(reader.ReadUncompressedFile); break; case CompressionMode.Decompress: readingThread = new Thread(reader.ReadCompressedFile); break; default: throw new ArgumentOutOfRangeException("Parameter \"mode\" passed to " + System.Reflection.MethodInfo.GetCurrentMethod().Name + " method is out of range."); } readingThread.Start(); NumberedQueue targetBuffer = new NumberedQueue(_numberOfGzipThreads * 2); Writer writer = new Writer(targetFilePath, targetBuffer); Thread writingThread = new Thread(writer.WriteResultToFile); writingThread.Start(); GzipOperator[] gzipWorkers = new GzipOperator[_numberOfGzipThreads]; Thread[] gzipThreads = new Thread[_numberOfGzipThreads]; for (int i = 0; i < _numberOfGzipThreads; i++) { gzipWorkers[i] = new GzipOperator(sourceBuffer, targetBuffer); switch (mode) { case CompressionMode.Compress: gzipThreads[i] = new Thread(gzipWorkers[i].Compress); break; case CompressionMode.Decompress: gzipThreads[i] = new Thread(gzipWorkers[i].Decompress); break; default: throw new ArgumentOutOfRangeException("Parameter \"mode\" passed to " + System.Reflection.MethodInfo.GetCurrentMethod().Name + " method is out of range."); } gzipThreads[i].Start(); } writingThread.Join(); Console.WriteLine("Process completed successfully. Press any key to exit."); Console.ReadKey(true); return(0); }
internal GzipOperator(NumberedQueue sourceBuffer, NumberedQueue targetBuffer) { _sourceBuffer = sourceBuffer; _targetBuffer = targetBuffer; }
private int _blockCount = 0; // Это поле используется для визуализации в консоли (для красоты). internal Writer(string filePath, NumberedQueue buffer) : base(buffer) { fs = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None); }
internal Reader(string filePath, NumberedQueue buffer) : base(buffer) { fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); _blockCount = 0; }
internal FileUser(NumberedQueue buffer) { this.buffer = buffer; }