AssetStudio/AssetStudio/ResourceReader.cs

71 lines
2.3 KiB
C#
Raw Normal View History

2018-11-21 07:37:56 +00:00
using System.IO;
namespace AssetStudio
{
public class ResourceReader
{
private bool needSearch;
private string path;
private SerializedFile assetsFile;
private long offset;
private int size;
private BinaryReader reader;
2020-08-12 11:13:10 +00:00
public ResourceReader(string path, SerializedFile assetsFile, ulong offset, int size)
2018-11-21 07:37:56 +00:00
{
needSearch = true;
this.path = path;
this.assetsFile = assetsFile;
2020-08-12 11:13:10 +00:00
this.offset = (long)offset;
2018-11-21 07:37:56 +00:00
this.size = size;
}
public ResourceReader(BinaryReader reader, long offset, int size)
{
this.reader = reader;
this.offset = offset;
this.size = size;
}
public byte[] GetData()
{
if (needSearch)
{
var resourceFileName = Path.GetFileName(path);
2020-03-28 05:33:37 +00:00
if (assetsFile.assetsManager.resourceFileReaders.TryGetValue(resourceFileName, out reader))
2018-11-21 07:37:56 +00:00
{
2020-03-28 05:33:37 +00:00
needSearch = false;
reader.BaseStream.Position = offset;
2018-11-21 07:37:56 +00:00
return reader.ReadBytes(size);
}
2020-03-28 05:33:37 +00:00
var assetsFileDirectory = Path.GetDirectoryName(assetsFile.fullName);
var resourceFilePath = assetsFileDirectory + Path.DirectorySeparatorChar + resourceFileName;
2018-11-21 07:37:56 +00:00
if (!File.Exists(resourceFilePath))
{
2020-03-28 05:33:37 +00:00
var findFiles = Directory.GetFiles(assetsFileDirectory, resourceFileName, SearchOption.AllDirectories);
2018-11-21 07:37:56 +00:00
if (findFiles.Length > 0)
{
resourceFilePath = findFiles[0];
}
}
if (File.Exists(resourceFilePath))
{
2020-03-28 05:33:37 +00:00
reader = new BinaryReader(File.OpenRead(resourceFilePath));
needSearch = false;
assetsFile.assetsManager.resourceFileReaders.Add(resourceFileName, reader);
reader.BaseStream.Position = offset;
return reader.ReadBytes(size);
2018-11-21 07:37:56 +00:00
}
throw new FileNotFoundException($"Can't find the resource file {resourceFileName}");
}
reader.BaseStream.Position = offset;
return reader.ReadBytes(size);
}
}
}