예제 #1
0
        /// <summary>
        /// Perform file compression or decompression action
        /// </summary>
        /// <param name="actionType">Action name. Possible values: compress, decompress</param>
        /// <param name="workersCount">Number of threads</param>
        /// <param name="chunkSize">Chunk size in bytes</param>
        /// <param name="errors">Exceptions</param>
        /// <returns>Operation result</returns>
        public bool Execute(string actionType, int workersCount, int chunkSize, out List <Exception> errors)
        {
            ChunksInfo chunkInfos = _fileSplitterFactory.Create(actionType).GetChunks(_inFile, chunkSize);

            using (IWriterTask fileWriterTask = _taskFactory.CreatWriterTask(chunkInfos.ChunksCount, _chunkWriter, _errorLogs))
                using (IChunksReader chunksReader = _taskFactory.CreateChunksReader(workersCount, _sourceReader,
                                                                                    _compressorFactory.Create(actionType), fileWriterTask, _errorLogs))
                {
                    foreach (ChunkReadInfo chunkInfo in chunkInfos.Chunks)
                    {
                        chunksReader.EnqueueChunk(new ChunkReadInfo(chunkInfo.Id, chunkInfo.Offset, chunkInfo.BytesCount));
                    }

                    while (true)
                    {
                        if (!_errorLogs.IsErrorExist(out List <Exception> exceptions))
                        {
                            if (!IsActiveOp(chunksReader, fileWriterTask))
                            {
                                return(!_errorLogs.IsErrorExist(out errors));
                            }

                            continue;
                        }

                        errors = exceptions;
                        return(false);
                    }
                }
        }
예제 #2
0
        public int Start()
        {
            if (!_settingsChecker.CheckSettings())
            {
                _messageService.Message(Properties.Resources.UnableToProceed);
                //завершение программы потому что сеттинги плохие
                return(0);
            }
            switch (_settings.Mode)
            {
            case ApplicationMode.Compress:
            {
                //необходимо разделить контекст поэтому фабрика а не прямая зависимость
                using (var compressor = _compressorFactory.Create())
                {
                    if (compressor.Compress())
                    {
                        return(1);
                    }
                }
                return(0);
            }

            case ApplicationMode.Decompress:
            {
                //необходимо разделить контекст поэтому фабрика а не прямая зависимость
                using (var decompressor = _decompressorFactory.Create())
                {
                    if (decompressor.Decompress())
                    {
                        return(1);
                    }
                }
                return(0);
            }

            default:
                return(0);
            }
        }
예제 #3
0
        public void FactoryWillCreateGZipCompressObj()
        {
            IGZipCompressor gzipCompressor = _compressorFactory.Create(Constants.Compress);

            Assert.IsAssignableFrom <GZipCompress>(gzipCompressor);
        }