Beispiel #1
0
 private Archive.DirectoryEntry ReadDirectoryEntry(BinaryReader br)
 {
     Archive.DirectoryEntry directoryEntry = new Archive.DirectoryEntry();
     directoryEntry.nameOffset = br.ReadUInt32();
     directoryEntry.nextBlock  = br.ReadUInt32();
     return(directoryEntry);
 }
Beispiel #2
0
    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);
    }