public IBigFileFolderInfo[] ReadFolderInfos(Stream stream, ref BigFileSegmentHeader segmentHeader, ref BigFileHeaderStruct header) { if (version == null) { throw new NullReferenceException("Version cannot be null!"); } log.Info("Reading big file folders, count: {0}", header.Folders); BigFileVersions.DebugLogVersion(version, log); diag.StartStopwatch(); IBigFileFolderInfo[] infos = new IBigFileFolderInfo[header.Folders]; IBigFileFolderInfo tmpInfo = version.CreateFolderInfo(); int folderOffset = BigFileUtil.CalculateFolderOffset(version, ref segmentHeader, ref header); byte[] buffer = buffers[tmpInfo.StructSize]; stream.Seek(folderOffset, SeekOrigin.Begin); for (short i = 0; i < header.Folders; i++) { stream.Read(buffer, 0, tmpInfo.StructSize); infos[i] = tmpInfo.FromBytes(buffer); infos[i].DebugLog(log); } log.Info("Folder infos read! Time taken: {0}ms", diag.StopwatchTime); return(infos); }
public BigFileFolder(short _folderIndex, IBigFileFolderInfo _infoStruct, Dictionary <short, BigFileFolder> _folderMap) { FolderIndex = _folderIndex; infoStruct = _infoStruct; FolderMap = _folderMap; name = infoStruct.Name.EncodeToGoodString(); }
public static void Copy(this IBigFileFolderInfo source, IBigFileFolderInfo target) { target.Unknown_01 = source.Unknown_01; target.PreviousFolder = source.PreviousFolder; target.NextFolder = source.NextFolder; target.Unknown_02 = source.Unknown_02; Array.Copy(source.Name, target.Name, source.Name.Length); }
public static int CalculateDataOffset(IBigFileVersion version, ref BigFileSegmentHeader segmentHeader, ref BigFileHeaderStruct header) { if (version == null) { throw new NullReferenceException("There's no version! Can't calculate data offset!"); } IBigFileFolderInfo tmpFolderInfo = version.CreateFolderInfo(); int folderOffset = CalculateFolderOffset(version, ref segmentHeader, ref header); int dataOffset = folderOffset + (header.Folders * tmpFolderInfo.StructSize); dataOffset = (((dataOffset - 1) / 8) + 1) * 8; // align to 8 bytes; return(dataOffset); }
public UnpackedFolderMapAndFilesList CreateFolderTreeAndFilesListFromDirectory(DirectoryInfo dir, UnpackedRenamedFileMapping mapping, FileMappingData defaultMappingData) { log.Info("Creating folder tree and files list from directory " + dir.FullName); IBigFileFileInfo[] fileInfos = new IBigFileFileInfo[mapping.KeyMap.Count]; List <IBigFileFolderInfo> folderInfos = new List <IBigFileFolderInfo>(); Dictionary <short, BigFileFolder> folderMap = new Dictionary <short, BigFileFolder>(); short folderCount = 0; int fileCount = 0; Dictionary <string, UnpackedRenamedFileMapping.RenamedFileMappingData> temp = new Dictionary <string, UnpackedRenamedFileMapping.RenamedFileMappingData>(mapping.RenamedMap); BigFileFolder recursion(DirectoryInfo directory, string dirName, BigFileFolder parentFolder) { IBigFileFolderInfo folderInfo = version.CreateFolderInfo(); folderInfo.Unknown_01 = 0; folderInfo.PreviousFolder = parentFolder != null ? parentFolder.FolderIndex : (short)-1; folderInfo.NextFolder = -1; folderInfo.Unknown_02 = 0; folderInfo.Name = parentFolder == null ? //oh my lawdy what is this EDIT 4/5/2018: what the f**k "/".EncodeToBadString(length: 54) : directory.Name.EncodeToBadString(length: 54); folderInfos.Add(folderInfo); BigFileFolder thisFolder = new BigFileFolder(folderCount, folderInfo, folderMap); folderMap.Add(folderCount, thisFolder); foreach (FileInfo file in directory.GetFiles()) { if (file.Name.EndsWith(".header")) { continue; } string fileName = dirName + "//" + file.Name; UnpackedRenamedFileMapping.RenamedFileMappingData mappingData = mapping[fileName]; temp.Remove(fileName); IBigFileFileInfo fileInfo = version.CreateFileInfo(); defaultMappingData[mappingData.Key].FileInfo.Copy(fileInfo); fileInfo.Key = mappingData.Key; //fileInfo.FileNumber = fileCount; fileInfo.Name = mappingData.OriginalName.EncodeToBadString(length: 60); fileInfo.Folder = folderCount; log.Debug("Add file " + file.FullName); fileInfos[fileCount] = fileInfo; fileCount++; } folderCount++; foreach (DirectoryInfo dirInfo in directory.GetDirectories()) { if (parentFolder == null) //ONLY THE FIRST RECURSION, PREVENTS ADDING WRONG FOLDERS WHEN PACKING { thisFolder.SubFolders.Add(recursion(dirInfo, dirInfo.Name, thisFolder)); } else { thisFolder.SubFolders.Add(recursion(dirInfo, dirName + "/" + dirInfo.Name, thisFolder)); } } return(thisFolder); } recursion(dir, "", null); if (fileCount != mapping.KeyMap.Count) { log.Error(string.Format("Missing {0} files!", temp.Count)); foreach (KeyValuePair <string, UnpackedRenamedFileMapping.RenamedFileMappingData> kvp in temp) { log.Error(string.Format(" >{0}", kvp.Value.FileName)); } } return(new UnpackedFolderMapAndFilesList() { folderMap = folderMap, filesList = fileInfos, foldersList = folderInfos.ToArray(), }); }