//II.保存区块解析中断时的上下文状态 public void saveBlockProcessContext() { if (countOfFileBlock(blockCountOfFile) != blockReadBlocksFromFile.Count) { Console.WriteLine("读取文件总数和区块池文件总数不一致"); } else { record_OrphanBlock(); fileStatusList.Clear(); int readBlockPointer = 0; for (int i = 0; i < blockCountOfFile.Count; i++) { string fileName = get_filename(i); int totalBlocks = blockCountOfFile[i]; int unusedBlocks = 0; List <string> unusedBlockHash = new List <string>(); for (int j = 0; j < blockCountOfFile[i]; j++) { if (blockReadBlocksFromFile[readBlockPointer] != null) { unusedBlockHash.Add(blockReadBlocksFromFile[readBlockPointer].Header.GetHash().ToString()); unusedBlocks++; } readBlockPointer++; } fileStatusList.Add(new FileStatusItem_Class(fileName, totalBlocks, unusedBlocks, unusedBlockHash)); } string blockProcessContextFileFinalPath = Path.Combine(blockProcessContextFilePath, "BPC_" + processedBlockAmount + "_" + lastProcessedBlockElement.Header.BlockTime.ToString("yyyy年MM月dd日HH时mm分ss秒") + ".dat"); BlockProcessContextModel_Class blockProcessContextModel = new BlockProcessContextModel_Class(fileStatusList, forkedBlockList, orphanBlockList, lastProcessedBlockElement.Header.GetHash().ToString(), processedBlockAmount, blockReadPointer, currentLoadFileNumber, lastProcessedBlockElement.Header.BlockTime.DateTime); using (StreamWriter sw = File.CreateText(blockProcessContextFileFinalPath)) { JsonSerializer serializer = new JsonSerializer(); serializer.Serialize(sw, blockProcessContextModel); } Compress(blockProcessContextFileFinalPath, true); } }
//l.从给定的BPC文件恢复程序状态 public void restore_BlockProcessContextForProgram() { string blockProcessContextFileFinalPath = Path.Combine(blockProcessContextFilePath, blockProcessContextFileName); //判断给定文件名是压缩文件还是txt文件 FileInfo fileName = new FileInfo(blockProcessContextFileFinalPath); if (fileName.Extension == ".rar") { Console.WriteLine("正在解压BPC下文状态文件......"); Decompress(blockProcessContextFileFinalPath, false); blockProcessContextFileFinalPath = Path.Combine(blockProcessContextFilePath, Path.GetFileNameWithoutExtension(blockProcessContextFileFinalPath)); } if (File.Exists(blockProcessContextFileFinalPath)) { //1.反序列化BPC文件 Console.WriteLine("开始提取程序上下文状态文件数据(BPC)........."); BlockProcessContextModel_Class blockProcessContextModelObject = null; Stopwatch timer = new Stopwatch(); timer.Start(); try { using (StreamReader sr = File.OpenText(blockProcessContextFileFinalPath)) { JsonSerializer jsonSerializer = new JsonSerializer(); blockProcessContextModelObject = jsonSerializer.Deserialize(sr, typeof(BlockProcessContextModel_Class)) as BlockProcessContextModel_Class; } } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine("BPC文件保存不完整或已经损坏。该错误可能是由于在保存BPC文件时提前终止程序造成的,或是人为修改了最近的BPC文件。"); } timer.Stop(); Console.WriteLine("提取结束,反序列化切片用时:" + timer.Elapsed); //2.恢复区块池 Console.WriteLine("开始恢复区块池........."); Stopwatch timer1 = new Stopwatch(); timer1.Start(); restore_blockReadBlocksFromFile(blockProcessContextModelObject.fileStatusList); timer1.Stop(); Console.WriteLine("恢复区块池用时:" + timer1.Elapsed); //3.恢复参数 forkedBlockList = blockProcessContextModelObject.forkedBlockList; orphanBlockList = blockProcessContextModelObject.orphanBlockList; blockReadPointer = blockProcessContextModelObject.blockReadPointer; currentLoadFileNumber = blockProcessContextModelObject.currentLoadFileNumber; processedBlockAmount = blockProcessContextModelObject.processedBlockAmount; recentlySliceDateTime = blockProcessContextModelObject.blockProcessContextDatetime; blockProcessContextModelObject.Dispose(); //4.恢复队列池 Console.WriteLine("开始恢复区块队列........."); Stopwatch timer2 = new Stopwatch(); timer2.Start(); ParserBlock queueBlock; if ((queueBlock = restore_QueueHeaderBlock(blockProcessContextModelObject.lastProcessedBlockHash)) != null) { initialize_BlockQueuePooling(queueBlock); } else { Console.WriteLine("队首区块未找到,恢复失败!!!"); } timer2.Stop(); Console.WriteLine("恢复区块队列用时:" + timer2.Elapsed); Console.WriteLine("BPC上下文状态恢复成功........."); File.Delete(blockProcessContextFileFinalPath);//删除解压后的文件BPC文件 } else { Console.WriteLine(blockProcessContextFileFinalPath + " 文件不存在!!!"); } }