public void Save() { List <CompressedFileRecord> objSavedRecords = new List <CompressedFileRecord>(); string strTempFilePath = Path.GetTempFileName(); using (FileStream objTempFileStream = new FileStream(strTempFilePath, FileMode.Create, FileAccess.ReadWrite)) { CompressedFileRecord[] objInsertedRecords = CompressedFileRecordManager.InsertedRecords; foreach (CompressedFileRecord objInsertedRecord in objInsertedRecords) { using (FileStream objInputFile = new FileStream(objInsertedRecord.OriginalFilePath, FileMode.Open, FileAccess.Read, FileShare.Read)) { int intStartingPosition = (int)objTempFileStream.Position; CompressionManager.Compress(objInputFile, objTempFileStream); int intCompressedSize = (int)objTempFileStream.Position - intStartingPosition; CompressedFileRecord objSavedRecord = new CompressedFileRecord(objInsertedRecord.OriginalFilePath, intCompressedSize, objInsertedRecord.RelativePath); objSavedRecord.Keys.AddRange(objInsertedRecord.Keys); objSavedRecords.Add(objSavedRecord); } objTempFileStream.Flush(); } CompressedFileRecord[] objUpdatedRecords = CompressedFileRecordManager.UpdatedRecords; foreach (CompressedFileRecord objUpdatedRecord in objUpdatedRecords) { int intFileStartIndex = CompressedFileRecordManager.FindFileStartIndex(objUpdatedRecord); if (intFileStartIndex != -1) { CompressedStream.Position = intFileStartIndex; CompressionManager.CopyToStream(CompressedStream, objTempFileStream, objUpdatedRecord.CompressedSize); objSavedRecords.Add(objUpdatedRecord); } objTempFileStream.Flush(); } objTempFileStream.Position = 0; CompressedStream.SetLength(0); CompressedStream.Position = 0; CompressedStream.Write(CompressedStreamSignature, 0, CompressedStreamSignature.Length); string strSavedRecords = CompressedFileRecordManager.ToString(objSavedRecords.ToArray()); byte[] bytSavedRecords = ASCIIEncoding.ASCII.GetBytes(strSavedRecords); byte[] bytCompressedRecords = CompressionManager.Compress(bytSavedRecords); int intRecordLength = bytCompressedRecords.Length; byte[] bytHeaderRecordLength = BitConverter.GetBytes(intRecordLength); CompressedStream.Write(bytHeaderRecordLength, 0, bytHeaderRecordLength.Length); CompressedStream.Write(bytCompressedRecords, 0, bytCompressedRecords.Length); CompressionManager.CopyToStream(objTempFileStream, CompressedStream); CompressedStream.Flush(); } File.Delete(strTempFilePath); Refresh(); }
public static string DecompressToString(byte[] bytData) { byte[] bytDecompressedData = CompressionManager.Decompress(bytData); string strData = ASCIIEncoding.ASCII.GetString(bytDecompressedData); return(strData); }
private void Refresh() { int intFileDataStartingIndex = 0; CompressedFileRecord[] objRecords = new CompressedFileRecord[] { }; CompressedStream.Position = 0; if (CompressedStream.Length > 0) { if (CompressedStream.Length < CompressedStreamSignature.Length) { throw new Exception("The stream does not represent a valid format."); } byte[] bytBuffer = new byte[CompressedStreamSignature.Length]; CompressedStream.Read(bytBuffer, 0, bytBuffer.Length); for (int intIndex = 0; intIndex < bytBuffer.Length; intIndex++) { if (bytBuffer[intIndex] != CompressedStreamSignature[intIndex]) { throw new Exception("The stream does not represent a valid format."); } } bytBuffer = new byte[4]; CompressedStream.Read(bytBuffer, 0, 4); int intRecordLength = BitConverter.ToInt32(bytBuffer, 0); bytBuffer = new byte[intRecordLength]; CompressedStream.Read(bytBuffer, 0, intRecordLength); intFileDataStartingIndex = (int)CompressedStream.Position; byte[] bytRecordBytes = CompressionManager.Decompress(bytBuffer); string strRecordData = ASCIIEncoding.ASCII.GetString(bytRecordBytes); objRecords = CompressedFileRecordManager.FromString(strRecordData); } CompressedFileRecordManager = new CompressedFileRecordManager(intFileDataStartingIndex, objRecords, CompressedFileRecordState.Updated); }
private void ExtractFile(CompressedFileRecord objRecord, CompressedFileRecordState enuRecordState, Stream objTargetStream) { if (enuRecordState == CompressedFileRecordState.Inserted) { using (FileStream objDiskFileStream = new FileStream(objRecord.OriginalFilePath, FileMode.Open, FileAccess.Read)) { CompressionManager.CopyToStream(objDiskFileStream, objTargetStream); } } else { int intFileStartIndex = CompressedFileRecordManager.FindFileStartIndex(objRecord); if (intFileStartIndex == -1) { throw new FileNotFoundException("Unable to locate '" + objRecord.RelativeFilePath + "' within package."); } CompressedStream.Position = intFileStartIndex; CompressionManager.Decompress(CompressedStream, objTargetStream, objRecord.Size); } }
public static byte[] CompressFromString(string strInputString) { byte[] bytData = ASCIIEncoding.ASCII.GetBytes(strInputString); byte[] bytCompressedData = CompressionManager.Compress(bytData); return(bytCompressedData); }