From dbfff7fabe63aa744f06a779299b5d9a0c6100e9 Mon Sep 17 00:00:00 2001 From: Omar Date: Thu, 28 Oct 2021 20:01:40 -0400 Subject: [PATCH] Fix input files filter to account for each file case --- src/nxDumpFuse/Model/Enums/FileCase.cs | 12 +++++++ src/nxDumpFuse/Model/Fuse.cs | 44 ++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 src/nxDumpFuse/Model/Enums/FileCase.cs diff --git a/src/nxDumpFuse/Model/Enums/FileCase.cs b/src/nxDumpFuse/Model/Enums/FileCase.cs new file mode 100644 index 0000000..5057633 --- /dev/null +++ b/src/nxDumpFuse/Model/Enums/FileCase.cs @@ -0,0 +1,12 @@ +namespace nxDumpFuse.Model.Enums +{ + public enum FileCase + { + XciNumeric, // .xci.00 + NspNumeric, // .nsp.00 + Xci, // .xc0 + Nsp, // .ns0 + Numeric // dir/00 + + } +} diff --git a/src/nxDumpFuse/Model/Fuse.cs b/src/nxDumpFuse/Model/Fuse.cs index bd6a681..813022a 100644 --- a/src/nxDumpFuse/Model/Fuse.cs +++ b/src/nxDumpFuse/Model/Fuse.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Threading; @@ -17,6 +18,7 @@ namespace nxDumpFuse.Model private readonly string _inputFilePath; private readonly string _outputDir; private string _outputFilePath = string.Empty; + private FileCase _fileCase; public Fuse(string inputFilePath, string outputDir) { @@ -80,8 +82,8 @@ namespace nxDumpFuse.Model Log(FuseSimpleLogType.Error, "No input files found"); return; } - inputFiles.Sort(); - FuseFiles(inputFiles, _outputFilePath); + + FuseFiles(inputFiles); } private void GetOutputFilePath() @@ -96,23 +98,30 @@ namespace nxDumpFuse.Model if (int.TryParse(ext, out _) && split.Count >= 3 && split[^2] == XciExt) // .xci.00 { _outputFilePath = Path.Join(_outputDir, $"{string.Join("", split.Take(split.Count - 2))}.{XciExt}"); + _fileCase = FileCase.XciNumeric; } else if (int.TryParse(ext, out _) && split.Count >= 3 && split[^2] == NspExt) // .nsp.00 + { _outputFilePath = Path.Join(_outputDir, $"{string.Join("", split.Take(split.Count - 2))}.{NspExt}"); + _fileCase = FileCase.NspNumeric; + } else switch (ext[..2]) { // .xc0 case "xc" when int.TryParse(ext.Substring(ext.Length - 1, 1), out _): _outputFilePath = Path.Join(_outputDir, $"{Path.GetFileNameWithoutExtension(fileName)}.{XciExt}"); + _fileCase = FileCase.Xci; break; // .ns0 case "ns" when int.TryParse(ext.Substring(ext.Length - 1, 1), out _): _outputFilePath = Path.Join(_outputDir, $"{Path.GetFileNameWithoutExtension(fileName)}.{NspExt}"); + _fileCase = FileCase.Nsp; break; } } else // dir/00 { + _fileCase = FileCase.Numeric; var inputDir = new FileInfo(_inputFilePath).Directory?.Name; if (string.IsNullOrEmpty(inputDir)) { @@ -128,16 +137,16 @@ namespace nxDumpFuse.Model } } - private async void FuseFiles(IReadOnlyCollection inputFiles, string outputFilePath) + private async void FuseFiles(IReadOnlyCollection inputFiles) { var buffer = new byte[1024 * 1024]; var count = 0; long totalBytes = 0; var totalFileLength = GetTotalFileSize(inputFiles); - Log(FuseSimpleLogType.Information, $"Fusing {inputFiles.Count} parts to {outputFilePath} ({ToMb(totalFileLength)}MB)"); + Log(FuseSimpleLogType.Information, $"Fusing {inputFiles.Count} parts to {_outputFilePath} ({ToMb(totalFileLength)}MB)"); - await using var outputStream = File.Create(outputFilePath); + await using var outputStream = File.Create(_outputFilePath); foreach (var inputFilePath in inputFiles) { if (_cts.Token.IsCancellationRequested) return; @@ -189,8 +198,29 @@ namespace nxDumpFuse.Model private List GetInputFiles() { var inputDir = Path.GetDirectoryName(_inputFilePath); - if (string.IsNullOrEmpty(inputDir)) inputDir = Path.GetPathRoot(_inputFilePath); - return inputDir != null ? Directory.GetFiles(inputDir, $"{Path.GetFileNameWithoutExtension(_inputFilePath)}*").ToList() : new List(); + if (string.IsNullOrEmpty(inputDir)) return new List(); + var files = new List(); + switch (_fileCase) + { + case FileCase.XciNumeric: // .xci.00 + case FileCase.NspNumeric: // .nsp.00 + files = Directory.GetFiles(inputDir) + .Where(f => int.TryParse(Path.GetExtension(f).Replace(".", ""), out _)) + .ToList(); + break; + case FileCase.Xci: // .xc0 + case FileCase.Nsp: // .ns0 + files = Directory.GetFiles(inputDir, $"{Path.GetFileNameWithoutExtension(_inputFilePath)}*") + .ToList(); + break; + case FileCase.Numeric: // dir/00 + files = Directory.GetFiles(inputDir) + .Where(f => int.TryParse(Path.GetFileName(f), out _)) + .ToList(); + break; + } + files.Sort(); + return files; } public void StopFuse()