Exemple #1
0
        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);
        }
Exemple #2
0
        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>();
        }