示例#1
0
        public cDatFileNode(StreamReader inputFile, cDatFileBlockCache blockCache, uint startBlockOffset, int blockSize, eDatFormat fileFormat)
        {
            this.startBlockOffset = startBlockOffset;
            this.blockSize        = blockSize;

            int size;

            if (fileFormat == eDatFormat.ToD)
            {
                size = sizeToD;
            }
            else
            {
                size = sizeRetail;
            }

            listOfBlocks = new List <cDatFileBlock>();
            MemoryStream memoryStream = blockCache.blocksToData(startBlockOffset, size, listOfBlocks);

            memoryStream.Position = 0;
            StreamReader reader = new StreamReader(memoryStream);

            files      = new SortedDictionary <uint, cDatFileEntry>(); //max 61
            subFolders = new List <cDatFileNode>();                    //max 62

            List <uint> subFolderOffsets = new List <uint>();

            for (int i = 0; i < 62; i++)
            {
                subFolderOffsets.Add(Utils.readUInt32(reader));
            }
            uint entryCount = Utils.readUInt32(reader);

            // folder is allowed to have (files + 1) subfolders
            if (subFolderOffsets[0] != 0)
            {
                for (int i = 0; i < entryCount + 1; i++)
                {
                    cDatFileNode newDirectory = new cDatFileNode(inputFile, blockCache, subFolderOffsets[i], blockSize, fileFormat);
                    subFolders.Add(newDirectory);
                }
            }

            for (uint i = 0; i < entryCount; i++)
            {
                cDatFileEntry file = new cDatFileEntry(reader, fileFormat);
                files.Add(file.fileId, file);
            }
        }
示例#2
0
        public void loadFilesAndAddToCache(SortedDictionary <uint, cDatFileEntry> fileCache, cDatFileBlockCache blockCache, StreamReader inputFile, int blockSize)
        {
            foreach (cDatFileNode entry in subFolders)
            {
                entry.loadFilesAndAddToCache(fileCache, blockCache, inputFile, blockSize);
            }

            foreach (KeyValuePair <uint, cDatFileEntry> entry in files)
            {
                cDatFileEntry fileEntry = entry.Value;

                fileEntry.listOfBlocks = new List <cDatFileBlock>();
                fileEntry.fileContent  = blockCache.blocksToData(fileEntry.startBlockOffset, fileEntry.fileSize, fileEntry.listOfBlocks);

                fileCache[fileEntry.fileId] = fileEntry;
            }
        }