Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
            }
        }