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); } }
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; } }