Example #1
0
        public void StartProcess()
        {
            FileStream sourceFileStream = null;

            try
            {
                var initialWritePosition = Utils.CreateCompressedFileWithHeader(_compressedFilename);
                var fileMetadata         = new CompressedFileMetadata();

                sourceFileStream = new FileStream(_filenameToCompress, FileMode.Open, FileAccess.Read, FileShare.Read);
                var compressTask = GetTask(sourceFileStream, _filenameToCompress, _compressedFilename, fileMetadata, _blockSizeInBytes, initialWritePosition);
                _threadManager = GetThreadManager(sourceFileStream, _blockSizeInBytes);

                sourceFileStream.Close();

                _threadManager.RunInParallel(compressTask);
                _threadManager.WaitAll();

                Utils.WriteMetadata(_compressedFilename, fileMetadata);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error occured: {ex.Message}");
                Utils.DeleteFile(_compressedFilename);
                throw;
            }
            finally
            {
                sourceFileStream?.Dispose();
                _threadManager?.Dispose();
            }
        }
Example #2
0
 public CompressTask(string filenameToCompress, string compressedFilename, FixedSizeBlockGenerator inputStreamPositionGenerator, CompressedFileMetadata fileMetadata, long initialWritePosition)
 {
     _inputStreamPositionGenerator = inputStreamPositionGenerator;
     _filenameToCompress           = filenameToCompress;
     _compressedFilename           = compressedFilename;
     _fileMetadata  = fileMetadata;
     _writePosition = initialWritePosition;
 }
Example #3
0
        public static void WriteMetadata(string compressedFileName, CompressedFileMetadata fileMetadata)
        {
            using FileStream outputStream = new FileStream(compressedFileName, FileMode.Open, FileAccess.Write);

            var metadataPosition = BitConverter.GetBytes(outputStream.Length);

            outputStream.Write(metadataPosition);

            var serilizedData = JsonSerializer.Serialize(fileMetadata);

            using var memStream = new MemoryStream(Encoding.UTF8.GetBytes(serilizedData));
            using var zipStream = new GZipStream(outputStream, CompressionMode.Compress);

            outputStream.Seek(outputStream.Length, SeekOrigin.Begin);
            memStream.CopyTo(zipStream);
        }
Example #4
0
        private ICanceleableTask GetTask(Stream sourceFileStream, string fileNameToCompress, string compressedFileName, CompressedFileMetadata fileMetadata, int blockSize, long initialPosition)
        {
            var inputStreamPositionGenerator = new FixedSizeBlockGenerator(blockSize, sourceFileStream.Length);

            return(new CompressTask(fileNameToCompress, compressedFileName, inputStreamPositionGenerator, fileMetadata, initialPosition));
        }