Fixes for zip file reading

- Fixed path for split files
- Fixed assetsFile loading from an archive
This commit is contained in:
VaDiM
2025-07-19 15:57:46 +03:00
parent 6f8f1a5a8a
commit 34819608c5

View File

@ -187,7 +187,7 @@ namespace AssetStudio
return LoadFile(reader); return LoadFile(reader);
} }
private bool LoadFile(FileReader reader) private bool LoadFile(FileReader reader, bool fromZip = false)
{ {
if (reader == null) if (reader == null)
return false; return false;
@ -195,7 +195,7 @@ namespace AssetStudio
switch (reader.FileType) switch (reader.FileType)
{ {
case FileType.AssetsFile: case FileType.AssetsFile:
return LoadAssetsFile(reader); return LoadAssetsFile(reader, fromZip);
case FileType.BundleFile: case FileType.BundleFile:
return LoadBundleFile(reader); return LoadBundleFile(reader);
case FileType.WebFile: case FileType.WebFile:
@ -214,7 +214,7 @@ namespace AssetStudio
return true; return true;
} }
private bool LoadAssetsFile(FileReader reader) private bool LoadAssetsFile(FileReader reader, bool fromZip)
{ {
if (!assetsFileListHash.Contains(reader.FileName)) if (!assetsFileListHash.Contains(reader.FileName))
{ {
@ -226,6 +226,8 @@ namespace AssetStudio
CheckStrippedVersion(assetsFile); CheckStrippedVersion(assetsFile);
assetsFileList.Add(assetsFile); assetsFileList.Add(assetsFile);
assetsFileListHash.Add(assetsFile.fileName); assetsFileListHash.Add(assetsFile.fileName);
if (fromZip)
return true;
foreach (var sharedFile in assetsFile.m_Externals) foreach (var sharedFile in assetsFile.m_Externals)
{ {
@ -454,15 +456,16 @@ namespace AssetStudio
} }
// merge split files and load the result // merge split files and load the result
foreach (string basePath in splitFiles) for (var i = 0; i < splitFiles.Count; i++)
{ {
var basePath = splitFiles[i].Replace("\\", "/");
try try
{ {
Stream splitStream = new MemoryStream(); Stream splitStream = new MemoryStream();
int i = 0; var j = 0;
while (true) while (true)
{ {
string path = $"{basePath}.split{i++}"; string path = $"{basePath}.split{j++}";
ZipArchiveEntry entry = archive.GetEntry(path); ZipArchiveEntry entry = archive.GetEntry(path);
if (entry == null) if (entry == null)
break; break;
@ -473,7 +476,8 @@ namespace AssetStudio
} }
splitStream.Seek(0, SeekOrigin.Begin); splitStream.Seek(0, SeekOrigin.Begin);
FileReader entryReader = new FileReader(basePath, splitStream); FileReader entryReader = new FileReader(basePath, splitStream);
LoadFile(entryReader); if (!LoadFile(entryReader, fromZip: true))
break;
} }
catch (Exception e) catch (Exception e)
{ {
@ -487,6 +491,8 @@ namespace AssetStudio
Progress.Reset(); Progress.Reset();
foreach (ZipArchiveEntry entry in archive.Entries) foreach (ZipArchiveEntry entry in archive.Entries)
{ {
if (entry.Length == 0)
continue;
try try
{ {
string dummyPath = Path.Combine(Path.GetDirectoryName(reader.FullPath), reader.FileName, entry.FullName); string dummyPath = Path.Combine(Path.GetDirectoryName(reader.FullPath), reader.FileName, entry.FullName);
@ -501,7 +507,9 @@ namespace AssetStudio
streamReader.Position = 0; streamReader.Position = 0;
FileReader entryReader = new FileReader(dummyPath, streamReader); FileReader entryReader = new FileReader(dummyPath, streamReader);
LoadFile(entryReader); if (!LoadFile(entryReader, fromZip: true))
break;
if (entryReader.FileType == FileType.ResourceFile) if (entryReader.FileType == FileType.ResourceFile)
{ {
entryReader.Position = 0; entryReader.Position = 0;