private static ACXFileSystem OpenACXFileSystemFile(Stream stream, bool leaveOpen, string fileName)
        {
            var acx = new ACXFileSystem();

            LoadFileSystem <ACXFileSystem, int>(acx, stream, leaveOpen, fileName);
            return(acx);
        }
        public bool Execute(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("Expected at least 1 argument.");
                return(false);
            }

            var inputPath = args[0];

            if (!File.Exists(inputPath))
            {
                Console.WriteLine("Input file doesn't exist.");
                return(false);
            }

            var outputPath = Path.ChangeExtension(inputPath, null);

            if (args.Length > 1)
            {
                outputPath = args[1];
            }

            Directory.CreateDirectory(outputPath);

            var fs = new ACXFileSystem();

            try
            {
                fs.Load(inputPath);
            }
            catch (Exception)
            {
                Console.WriteLine("Invalid acx file.");
                return(false);
            }

            using ( fs )
            {
                foreach (int file in fs.EnumerateFiles(SearchOption.AllDirectories))
                {
                    using (var stream = FileUtils.Create(outputPath + Path.DirectorySeparatorChar + file.ToString("D3") + ".adx"))
                        using (var inputStream = fs.OpenFile(file))
                        {
                            Console.WriteLine($"Extracting: {file}");
                            inputStream.CopyTo(stream);
                        }
                }
            }

            return(true);
        }
        public bool Execute(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("Expected at least 1 argument");
                return(false);
            }

            var inputPath = args[0];

            if (!Directory.Exists(inputPath))
            {
                Console.WriteLine("Input directory doesn't exist");
                return(false);
            }

            var outputPath = Path.ChangeExtension(inputPath, "acx");

            if (args.Length > 1)
            {
                outputPath = args[1];
            }

            using (var fs = new ACXFileSystem())
            {
                foreach (string file in Directory.EnumerateFiles(inputPath, "*.*", SearchOption.AllDirectories))
                {
                    Console.WriteLine($"Adding file: {file}");
                    fs.AddFile(file);
                }

                Console.WriteLine("Saving...");
                fs.Save(outputPath);
            }

            return(true);
        }
        public bool Execute(string[] args)
        {
            if (args.Length < 2)
            {
                Console.WriteLine("Expected at least 2 arguments.");
                return(false);
            }

            var inputPath = args[0];

            if (!File.Exists(inputPath))
            {
                Console.WriteLine("Input file doesn't exist.");
                return(false);
            }

            var fs = new ACXFileSystem();

            try
            {
                fs.Load(inputPath);
            }
            catch (Exception)
            {
                Console.WriteLine("Invalid acx file");
                return(false);
            }

            string outputPath = inputPath;

            if (Directory.Exists(args[1]))
            {
                var directoryPath = args[1];

                if (args.Length > 2)
                {
                    outputPath = args[2];
                }

                using ( fs )
                {
                    foreach (string file in Directory.EnumerateFiles(directoryPath, "*.*", SearchOption.AllDirectories))
                    {
                        Console.WriteLine($"Adding/Replacing file: {file}");
                        var name = Path.GetFileName(file);
                        if (int.TryParse(name, out var handle))
                        {
                            fs.AddFile(handle, file, ConflictPolicy.Replace);
                        }
                        else
                        {
                            fs.AddFile(file);
                        }
                    }

                    Console.WriteLine("Saving...");
                    fs.Save(outputPath);
                }
            }
            else
            {
                if (args.Length > 3)
                {
                    outputPath = args[3];
                }

                using ( fs )
                {
                    var entryName = args[1];

                    if (int.TryParse(entryName, out var handle))
                    {
                        if (!fs.Exists(handle))
                        {
                            Console.WriteLine("Specified entry doesn't exist.");
                            return(false);
                        }

                        var filePath = args[2];
                        if (!File.Exists(filePath))
                        {
                            Console.WriteLine("Specified replacement file doesn't exist.");
                            return(false);
                        }

                        Console.WriteLine($"Adding/Replacing file: {filePath}");
                        fs.AddFile(handle, filePath, ConflictPolicy.Replace);

                        Console.WriteLine("Saving...");
                        fs.Save(outputPath);
                    }
                }
            }

            return(true);
        }