using System; using System.Collections.Generic; using System.Text; namespace UnityFileApi { // An archive node is a file in an archive. public struct ArchiveNode { public string Path; public long Size; public ArchiveNodeFlags Flags; } // Class used to open a Unity archive file (such as an AssetBundle). public class UnityArchive : IDisposable { internal UnityArchiveHandle m_Handle; Lazy> m_Nodes; public IReadOnlyList Nodes => m_Nodes.Value.AsReadOnly(); internal UnityArchive() { m_Nodes = new Lazy>(() => GetArchiveNodes()); } List GetArchiveNodes() { var r = DllWrapper.GetArchiveNodeCount(m_Handle, out var count); UnityFileSystem.HandleErrors(r); if (count == 0) return null; var nodes = new List(count); var path = new StringBuilder(512); for (var i = 0; i < count; ++i) { DllWrapper.GetArchiveNode(m_Handle, i, path, path.Capacity, out var size, out var flags); UnityFileSystem.HandleErrors(r); nodes.Add(new ArchiveNode() { Path = path.ToString(), Size = size, Flags = flags }); } return nodes; } public void Dispose() { if (m_Handle != null && !m_Handle.IsInvalid) { m_Handle.Dispose(); m_Nodes = new Lazy>(() => GetArchiveNodes()); } } } }