protected byte[] ReadFile(string assetPath) { if (assetPath == "/_metadata") { return(this.metadata); } // Get file var folder = assetPath.Substring(0, assetPath.LastIndexOf("/") + 1); if (!fileTree.ContainsKey(folder)) { return(null); } var file = fileTree[folder].Where(f => f.Path == assetPath).FirstOrDefault(); if (file == null) { return(null); } // Read data var data = PakReader.ReadItem(binaryReader, file); return(data); }
public PakProvider(string filePath, string targetRoot) { this.filePath = filePath; this.targetRoot = targetRoot; // Read pak file fileStream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); binaryReader = new BinaryReader(fileStream); var reader = new PakReader(); var metadata = reader.ReadIndex(binaryReader); this.metadata = Encoding.UTF8.GetBytes(metadata.ToString(Newtonsoft.Json.Formatting.Indented)); var files = reader.FindItems(binaryReader); fileTree = new Dictionary <string, List <PakItem> >(); // Map assets foreach (var file in files) { var dir = file.Path.Substring(0, file.Path.LastIndexOf("/") + 1); if (!fileTree.ContainsKey(dir)) { fileTree[dir] = new List <PakItem>(); } fileTree[dir].Add(file); } // Set up virtualization var notificationMappings = new List <NotificationMapping> { new NotificationMapping(NotificationType.FileOpened | NotificationType.PreDelete | NotificationType.PreRename, string.Empty) }; virtualizationInstance = new VirtualizationInstance(targetRoot, 0, 0, false, notificationMappings); // Disallow delete/rename. virtualizationInstance.OnNotifyPreDelete = new NotifyPreDeleteCallback((a, b, c, d) => false); virtualizationInstance.OnNotifyPreRename = new NotifyPreRenameCallback((a, b, c, d) => false); enumerations = new ConcurrentDictionary <Guid, FileEnumeration>(); }