improve file type check

This commit is contained in:
Perfare 2020-03-26 02:17:48 +08:00
parent 2bcd9662be
commit c8d08b2793
3 changed files with 48 additions and 7 deletions

View File

@ -139,9 +139,6 @@ namespace AssetStudio
catch
{
//Logger.Error($"Unable to load assets file {fileName} from {Path.GetFileName(originalPath)}");
}
finally
{
resourceFileReaders.Add(fileName, reader);
}
}
@ -156,8 +153,16 @@ namespace AssetStudio
var bundleFile = new BundleFile(reader, fullName);
foreach (var file in bundleFile.fileList)
{
var dummyPath = Path.GetDirectoryName(fullName) + "\\" + file.fileName;
LoadAssetsFromMemory(dummyPath, new EndianBinaryReader(file.stream), parentPath ?? fullName, bundleFile.versionEngine);
var subReader = new EndianBinaryReader(file.stream);
if (SerializedFile.IsSerializedFile(subReader))
{
var dummyPath = Path.GetDirectoryName(fullName) + Path.DirectorySeparatorChar + file.fileName;
LoadAssetsFromMemory(dummyPath, subReader, parentPath ?? fullName, bundleFile.versionEngine);
}
else
{
resourceFileReaders.Add(file.fileName, subReader);
}
}
}
catch
@ -196,6 +201,9 @@ namespace AssetStudio
case FileType.WebFile:
LoadWebFile(dummyPath, fileReader);
break;
case FileType.ResourceFile:
resourceFileReaders.Add(file.fileName, fileReader);
break;
}
}
}

View File

@ -8,7 +8,8 @@ namespace AssetStudio
{
AssetsFile,
BundleFile,
WebFile
WebFile,
ResourceFile
}
public static class ImportHelper
@ -96,7 +97,14 @@ namespace AssetStudio
{
return FileType.WebFile;
}
return FileType.AssetsFile;
if (SerializedFile.IsSerializedFile(reader))
{
return FileType.AssetsFile;
}
else
{
return FileType.ResourceFile;
}
}
}
}

View File

@ -330,5 +330,30 @@ namespace AssetStudio
return offset.ToString();
}
}
public static bool IsSerializedFile(EndianBinaryReader reader)
{
var fileSize = reader.BaseStream.Length;
if (fileSize < 16)
{
return false;
}
var m_MetadataSize = reader.ReadUInt32();
var m_FileSize = reader.ReadUInt32();
if (m_FileSize != fileSize)
{
reader.Position = 0;
return false;
}
var m_Version = reader.ReadUInt32();
var m_DataOffset = reader.ReadUInt32();
if (m_DataOffset > fileSize)
{
reader.Position = 0;
return false;
}
reader.Position = 0;
return true;
}
}
}