public IInfinityFile LoadFile(string path) { if (string.IsNullOrWhiteSpace(path)) { throw new ArgumentNullException("path"); } if (!File.Exists(path)) { throw new Exception(string.Format("Файла {0} не существует.", path)); } List <string> blockFiles = new List <string>(); var result = new HDDInfinityFileImpl(this, path); var formatter = new BinaryFormatter(); var rootPath = Path.GetTempPath() + Assembly.GetExecutingAssembly().GetName().Name + "\\"; using (var stream = File.Open(path, FileMode.Open, FileAccess.Read)) { using (var reader = new BinaryReader(stream)) { var header = LoadHeader(reader); var points = new List <HDDHdaPoint>(); for (int i = 0; i < header.PointsCount; i++) { var pointInfo = (PointInfo)formatter.Deserialize(reader.BaseStream); var blocks = (int)Math.Ceiling(pointInfo.ValuesCount / (1.0 * BLOCK_SIZE)); pointInfo.Folder = rootPath + Guid.NewGuid() + "\\"; pointInfo.BlockFiles = new string[blocks]; for (int j = 0; j < blocks; j++) { var file = string.Format("{0}{1}_{2}.part", pointInfo.Folder, "points", j); pointInfo.BlockFiles[j] = file; int blockSize = reader.ReadInt32(); var block = reader.ReadBytes(blockSize); if (File.Exists(file)) { File.Delete(file); } new FileInfo(file).Directory.Create(); using (var blockStream = File.Open(file, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { using (var memStream = new MemoryStream()) { memStream.Write(block, 0, blockSize); memStream.Seek(0, SeekOrigin.Begin); using (var zipStream = new GZipStream(memStream, CompressionMode.Decompress)) { zipStream.CopyTo(blockStream); } } } } points.Add(new HDDHdaPoint(pointInfo)); } result.Points = points; } } foreach (var blockFile in blockFiles) { File.Delete(blockFile); } return(result); }
internal void Save(HDDInfinityFileImpl file) { if (string.IsNullOrWhiteSpace(file.FilePath)) { throw new Exception("FileName is empty."); } List <string> blockFiles = new List <string>(); var rootPath = Path.GetTempPath() + Assembly.GetExecutingAssembly().GetName().Name + "\\"; blockFiles.AddRange(CompressedBlocksUtils.SaveToFileByParts(file.AddedEvents, "events", rootPath, BLOCK_SIZE)); blockFiles.AddRange(CompressedBlocksUtils.SaveToFileByParts(file.AddedConfigEvents, "configEvents", rootPath, BLOCK_SIZE)); if (File.Exists(file.FilePath)) { File.Delete(file.FilePath); } new FileInfo(file.FilePath).Directory.Create(); var serializer = new BinaryFormatter(); using (var stream = File.Open(file.FilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { using (var writer = new BinaryWriter(stream)) { writer.Write(Guid.Parse(Header).ToByteArray()); writer.Write(Version); long hashPosition = stream.Position; writer.Write(new byte[16]); writer.Write(file.AddedPoints.Count); writer.Write(file.AddedEvents.Length); writer.Write(file.AddedConfigEvents.Length); foreach (var addedPoint in file.AddedPoints) { serializer.Serialize(writer.BaseStream, addedPoint); foreach (var blockFile in addedPoint.BlockFiles) { using (var blockStream = File.Open(blockFile, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { writer.Write((int)blockStream.Length); blockStream.CopyTo(stream); } } } //Запись для событий и конфигурационных событий foreach (var blockFile in blockFiles) { using (var blockStream = File.Open(blockFile, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { writer.Write((int)blockStream.Length); blockStream.CopyTo(stream); } } stream.Seek(hashPosition + 16, SeekOrigin.Begin); using (var md5 = MD5.Create()) { var hash = md5.ComputeHash(stream); stream.Seek(hashPosition, SeekOrigin.Begin); writer.Write(hash); } } } foreach (var blockFile in blockFiles) { File.Delete(blockFile); } }