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(); } }
public CompressTask(string filenameToCompress, string compressedFilename, FixedSizeBlockGenerator inputStreamPositionGenerator, CompressedFileMetadata fileMetadata, long initialWritePosition) { _inputStreamPositionGenerator = inputStreamPositionGenerator; _filenameToCompress = filenameToCompress; _compressedFilename = compressedFilename; _fileMetadata = fileMetadata; _writePosition = initialWritePosition; }
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); }
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)); }