public void ReadIndexFile(string dataLocation, string fileName) { string filePath = dataLocation + fileName; if (File.Exists(filePath)) { using (FileStream fs = File.OpenRead(filePath)) { using (BinaryReader br = new BinaryReader(fs)) { ReadHeader(br); ReadGlobalBlockInfo(br); ReadAIDXBlock(br); Archive.FolderBlock folderBlock = ReadBlock((int)aidx.rootBlock, "AIDX", br); DataManager.DirectoryTree.Add("AIDX", folderBlock); // add root //Console.Log("FileNames : " + DataManager.FileNames.Count + " " + "fileList : " + DataManager.fileList.Count); } } } else { Console.Log("Missing file : " + fileName, Console.LogType.Error); } }
private Archive.FolderBlock ReadBlock(int blockNumber, string currentDir, BinaryReader br) { br.BaseStream.Seek((long)packBlockHeaders[blockNumber].blockOffset, SeekOrigin.Begin); Archive.FolderBlock folderBlock = new Archive.FolderBlock(); folderBlock.numSubdirectories = br.ReadUInt32(); folderBlock.numFiles = br.ReadUInt32(); if (folderBlock.numSubdirectories > 0) { Archive.DirectoryEntry[] directoryEntries = new Archive.DirectoryEntry[folderBlock.numSubdirectories]; for (int i = 0; i < folderBlock.numSubdirectories; i++) { directoryEntries[i] = ReadDirectoryEntry(br); } folderBlock.subDirectories = directoryEntries; } if (folderBlock.numFiles > 0) { Archive.FileEntry[] fileEntries = new Archive.FileEntry[folderBlock.numFiles]; for (int i = 0; i < folderBlock.numFiles; i++) { fileEntries[i] = ReadFileEntry(br); } folderBlock.files = fileEntries; } long remainingSize = (long)packBlockHeaders[blockNumber].blockSize - (br.BaseStream.Position - (long)packBlockHeaders[blockNumber].blockOffset); char[] nameslist = new char[remainingSize]; for (int i = 0; i < remainingSize; i++) { nameslist[i] = br.ReadChar(); } folderBlock.names = nameslist; if (folderBlock.subDirectories != null) { foreach (Archive.DirectoryEntry directoryEntry in folderBlock.subDirectories) { string word = ""; int increment = 0; for (int t = 0; t < 200; t++) { char c = folderBlock.names[directoryEntry.nameOffset + increment]; increment++; if (c != '\0') { word += c; } else { break; } } Archive.FolderBlock fB = ReadBlock((int)directoryEntry.nextBlock, currentDir + "\\" + word, br); DataManager.DirectoryTree.Add(currentDir + "\\" + word, fB); } } //long currentStreamPosition = br.BaseStream.Position; if (folderBlock.files != null) { foreach (Archive.FileEntry fileEntry in folderBlock.files) { //br.BaseStream.Seek(fileEntry.nameOffset, SeekOrigin.Begin); string word = ""; int increment = 0; for (int t = 0; t < 200; t++) { char c = folderBlock.names[fileEntry.nameOffset + increment]; //br.ReadChar(); increment++; if (c != '\0') { word += c; } else { break; } } //DataManager.FileNames.Add(fileEntry.nameOffset, word); string hash = DataManager.ToHex(fileEntry.hash); if (!DataManager.FileNames.ContainsKey(hash)) { DataManager.FileNames.Add(hash, word); } //else //Console.Log(DataManager.FileNames[fileEntry.nameOffset] + " " + word); DataManager.fileList.Add(currentDir + "\\" + word, fileEntry); } } //br.BaseStream.Seek(currentStreamPosition, SeekOrigin.Begin); return(folderBlock); }