예제 #1
0
        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));
        }
예제 #2
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);
        }