public byte[] getFileData(FileNode node) { Chunk CurNodeChunk = bindingWindow.getChunk(node.FromChunk); CurNodeChunk.cur_index = node.ChunkIndex; CurNodeChunk.cur_pointer = node.ChunkPointer; long size = node.Size; if (CurNodeChunk.ChunkCache.ContainsKey(CurNodeChunk.cur_index)) { CurNodeChunk.ChunkDecompressed = CurNodeChunk.ChunkCache[CurNodeChunk.cur_index]; } else { if (CurNodeChunk.ChunkCache.Count > 20) { CurNodeChunk.ChunkCache.Clear(); } CurNodeChunk.ChunkDecompressed = CurNodeChunk.getDecompressedChunk(CurNodeChunk.ChunkOffsetDict[CurNodeChunk.cur_index], CurNodeChunk.MetaChunk[CurNodeChunk.ChunkOffsetDict[CurNodeChunk.cur_index]], CurNodeChunk.Reader, CurNodeChunk.cur_index); CurNodeChunk.ChunkCache.Add(CurNodeChunk.cur_index, CurNodeChunk.ChunkDecompressed); } if (CurNodeChunk.ChunkCache.ContainsKey(CurNodeChunk.cur_index + 1)) { CurNodeChunk.NextChunkDecompressed = CurNodeChunk.ChunkCache[CurNodeChunk.cur_index + 1]; } else { if (CurNodeChunk.ChunkCache.Count > 20) { CurNodeChunk.ChunkCache.Clear(); } if (CurNodeChunk.cur_index + 1 < CurNodeChunk.DictCount) { CurNodeChunk.NextChunkDecompressed = CurNodeChunk.getDecompressedChunk(CurNodeChunk.ChunkOffsetDict[CurNodeChunk.cur_index + 1], CurNodeChunk.MetaChunk[CurNodeChunk.ChunkOffsetDict[CurNodeChunk.cur_index + 1]], CurNodeChunk.Reader, CurNodeChunk.cur_index + 1); } else { CurNodeChunk.NextChunkDecompressed = new byte[0]; } CurNodeChunk.ChunkCache.Add(CurNodeChunk.cur_index + 1, CurNodeChunk.NextChunkDecompressed); } return(CurNodeChunk.getOnLength(size, new byte[size], 0)); }
//Extact function public int ExtractSelected(List <FileNode> itemlist, string BaseLocation, MainWindow mainWindow) { int failed = 0; foreach (FileNode node in itemlist) { try { if (node.Childern.Count > 0) { failed += ExtractSelected(node.Childern, BaseLocation, mainWindow); } else if (node.IsSelected) { Chunk CurNodeChunk = mainWindow.getChunk(node.FromChunk); CurNodeChunk.cur_index = node.ChunkIndex; CurNodeChunk.cur_pointer = node.ChunkPointer; long size = node.Size; if (CurNodeChunk.ChunkCache.ContainsKey(CurNodeChunk.cur_index)) { CurNodeChunk.ChunkDecompressed = CurNodeChunk.ChunkCache[CurNodeChunk.cur_index]; } else { if (CurNodeChunk.ChunkCache.Count > 20) { CurNodeChunk.ChunkCache.Clear(); } CurNodeChunk.ChunkDecompressed = CurNodeChunk.getDecompressedChunk(CurNodeChunk.ChunkOffsetDict[CurNodeChunk.cur_index], CurNodeChunk.MetaChunk[CurNodeChunk.ChunkOffsetDict[CurNodeChunk.cur_index]], CurNodeChunk.Reader, CurNodeChunk.cur_index); CurNodeChunk.ChunkCache.Add(CurNodeChunk.cur_index, CurNodeChunk.ChunkDecompressed); } if (CurNodeChunk.ChunkCache.ContainsKey(CurNodeChunk.cur_index + 1)) { CurNodeChunk.NextChunkDecompressed = CurNodeChunk.ChunkCache[CurNodeChunk.cur_index + 1]; } else { if (CurNodeChunk.ChunkCache.Count > 20) { CurNodeChunk.ChunkCache.Clear(); } if (CurNodeChunk.cur_index + 1 < CurNodeChunk.DictCount) { CurNodeChunk.NextChunkDecompressed = CurNodeChunk.getDecompressedChunk(CurNodeChunk.ChunkOffsetDict[CurNodeChunk.cur_index + 1], CurNodeChunk.MetaChunk[CurNodeChunk.ChunkOffsetDict[CurNodeChunk.cur_index + 1]], CurNodeChunk.Reader, CurNodeChunk.cur_index + 1); } else { CurNodeChunk.NextChunkDecompressed = new byte[0]; } CurNodeChunk.ChunkCache.Add(CurNodeChunk.cur_index + 1, CurNodeChunk.NextChunkDecompressed); } if (!node.IsFile) { new FileInfo(BaseLocation + node.EntireName + "\\").Directory.Create(); } else { new FileInfo(BaseLocation + node.EntireName).Directory.Create(); } if (node.IsFile) { File.WriteAllBytes(BaseLocation + node.EntireName, CurNodeChunk.getOnLength(size, new byte[size], 0)); mainWindow.updateExtractProgress(); } } } catch (Exception ex) { if (!MainWindow.CNMode) { mainWindow.printlog($"Error occured while extracting {node.EntireName}{node.FromChunkName}, skipped. Please try again later."); } else { mainWindow.printlog($"提取 {node.EntireName}{node.FromChunkName} 时发生错误,已跳过,请稍后重试"); } Console.WriteLine(ex.StackTrace); failed += 1; } } return(failed); }