AssetStudio/AssetStudio/ImportHelper.cs

113 lines
4.0 KiB
C#
Raw Permalink Normal View History

2018-11-18 22:48:06 +00:00
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace AssetStudio
{
public enum FileType
{
AssetsFile,
BundleFile,
2020-03-25 18:17:48 +00:00
WebFile,
ResourceFile
2018-11-18 22:48:06 +00:00
}
public static class ImportHelper
{
public static void MergeSplitAssets(string path, bool allDirectories = false)
{
var splitFiles = Directory.GetFiles(path, "*.split0", allDirectories ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
foreach (var splitFile in splitFiles)
{
var destFile = Path.GetFileNameWithoutExtension(splitFile);
2020-08-06 13:07:37 +00:00
var destPath = Path.GetDirectoryName(splitFile);
var destFull = Path.Combine(destPath, destFile);
2018-11-18 22:48:06 +00:00
if (!File.Exists(destFull))
{
var splitParts = Directory.GetFiles(destPath, destFile + ".split*");
using (var destStream = File.Create(destFull))
{
for (int i = 0; i < splitParts.Length; i++)
{
var splitPart = destFull + ".split" + i;
using (var sourceStream = File.OpenRead(splitPart))
{
sourceStream.CopyTo(destStream);
}
}
}
}
}
}
public static string[] ProcessingSplitFiles(List<string> selectFile)
{
var splitFiles = selectFile.Where(x => x.Contains(".split"))
2020-08-06 13:07:37 +00:00
.Select(x => Path.Combine(Path.GetDirectoryName(x), Path.GetFileNameWithoutExtension(x)))
2018-11-18 22:48:06 +00:00
.Distinct()
.ToList();
selectFile.RemoveAll(x => x.Contains(".split"));
foreach (var file in splitFiles)
{
if (File.Exists(file))
{
selectFile.Add(file);
}
}
return selectFile.Distinct().ToArray();
}
public static FileType CheckFileType(Stream stream, out EndianBinaryReader reader)
{
reader = new EndianBinaryReader(stream);
return CheckFileType(reader);
}
public static FileType CheckFileType(string fileName, out EndianBinaryReader reader)
{
2020-09-26 15:29:38 +00:00
reader = new EndianBinaryReader(File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
2018-11-18 22:48:06 +00:00
return CheckFileType(reader);
}
private static FileType CheckFileType(EndianBinaryReader reader)
{
2018-12-10 20:50:38 +00:00
var signature = reader.ReadStringToNull(20);
2018-11-18 22:48:06 +00:00
reader.Position = 0;
switch (signature)
{
case "UnityWeb":
case "UnityRaw":
2020-04-07 08:13:04 +00:00
case "UnityArchive":
2018-11-18 22:48:06 +00:00
case "UnityFS":
return FileType.BundleFile;
case "UnityWebData1.0":
return FileType.WebFile;
default:
{
var magic = reader.ReadBytes(2);
reader.Position = 0;
if (WebFile.gzipMagic.SequenceEqual(magic))
{
return FileType.WebFile;
}
reader.Position = 0x20;
magic = reader.ReadBytes(6);
reader.Position = 0;
if (WebFile.brotliMagic.SequenceEqual(magic))
{
return FileType.WebFile;
}
2020-03-25 18:17:48 +00:00
if (SerializedFile.IsSerializedFile(reader))
{
return FileType.AssetsFile;
}
else
{
return FileType.ResourceFile;
}
2018-11-18 22:48:06 +00:00
}
}
}
}
}