diff --git a/SabreTools.FileTypes/Archives/GZipArchive.cs b/SabreTools.FileTypes/Archives/GZipArchive.cs index b9989b4d..a15efd5d 100644 --- a/SabreTools.FileTypes/Archives/GZipArchive.cs +++ b/SabreTools.FileTypes/Archives/GZipArchive.cs @@ -240,7 +240,7 @@ namespace SabreTools.FileTypes.Archives var gz = new gZip(); ZipReturn ret = gz.ZipFileOpen(Filename); ret = gz.ZipFileOpenReadStream(0, out Stream? gzstream, out ulong streamSize); - gzipEntryRom = FileTypeTool.GetInfo(gzstream, _hashTypes); + gzipEntryRom = FileTypeTool.GetInfo(gzstream, (long)streamSize, _hashTypes); gzipEntryRom.Filename = gz.GetLocalFile(0).Filename; gzipEntryRom.Parent = gamename; gzipEntryRom.Date = (gz.TimeStamp > 0 ? gz.TimeStamp.ToString() : null); @@ -406,7 +406,7 @@ namespace SabreTools.FileTypes.Archives #region Writing /// - public override bool Write(string file, string outDir, BaseFile? baseFile = null) + public override bool Write(string file, string outDir, BaseFile? baseFile) { // Check that the input file exists if (!File.Exists(file)) @@ -423,7 +423,7 @@ namespace SabreTools.FileTypes.Archives } /// - public override bool Write(Stream? stream, string outDir, BaseFile? baseFile = null) + public override bool Write(Stream? stream, string outDir, BaseFile? baseFile) { bool success = false; @@ -437,8 +437,8 @@ namespace SabreTools.FileTypes.Archives outDir = Path.GetFullPath(outDir); - // Now get the Rom info for the file so we have hashes and size - baseFile = FileTypeTool.GetInfo(stream, _hashTypes, keepReadOpen: true); + // If the base file is null, get the hash information + baseFile ??= FileTypeTool.GetInfo(stream, -1, _hashTypes, keepReadOpen: true); // Get the output file name string outfile = Path.Combine(outDir, Utilities.GetDepotPath(baseFile.SHA1, Depth) ?? string.Empty); @@ -457,7 +457,7 @@ namespace SabreTools.FileTypes.Archives BinaryWriter sw = new(outputStream); // Write standard header and TGZ info - byte[] data = [.. TorrentGZHeader, .. baseFile.MD5!, .. baseFile.CRC!]; + byte[] data = [.. TorrentGZHeader, .. baseFile!.MD5!, .. baseFile.CRC!]; sw.Write(data); sw.Write((ulong)(baseFile.Size ?? 0)); // Long size (Unsigned, Mirrored) diff --git a/SabreTools.FileTypes/Archives/XZArchive.cs b/SabreTools.FileTypes/Archives/XZArchive.cs index 0f1a77bf..30677d79 100644 --- a/SabreTools.FileTypes/Archives/XZArchive.cs +++ b/SabreTools.FileTypes/Archives/XZArchive.cs @@ -216,7 +216,7 @@ namespace SabreTools.FileTypes.Archives else { var xzStream = new XZStream(File.Open(Filename!, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); - xzEntryRom = FileTypeTool.GetInfo(xzStream, _hashTypes); + xzEntryRom = FileTypeTool.GetInfo(xzStream, size: -1, _hashTypes); xzEntryRom.Filename = gamename; xzStream.Dispose(); } @@ -331,8 +331,8 @@ namespace SabreTools.FileTypes.Archives outDir = Path.GetFullPath(outDir); - // Now get the Rom info for the file so we have hashes and size - baseFile = FileTypeTool.GetInfo(stream, _hashTypes, keepReadOpen: true); + // If the base file is null, get the hash information + baseFile ??= FileTypeTool.GetInfo(stream, -1, _hashTypes, keepReadOpen: true); // Get the output file name string outfile = Path.Combine(outDir, Core.Tools.Utilities.GetDepotPath(baseFile.SHA1, Depth)!); diff --git a/SabreTools.FileTypes/FileTypeTool.cs b/SabreTools.FileTypes/FileTypeTool.cs index b00bbd14..15093982 100644 --- a/SabreTools.FileTypes/FileTypeTool.cs +++ b/SabreTools.FileTypes/FileTypeTool.cs @@ -60,15 +60,6 @@ namespace SabreTools.FileTypes } } - /// - /// Retrieve file information for a single stream - /// - /// Stream to get information from - /// Hashes to include in the information - /// Populated BaseFile object if success, null on error - public static BaseFile GetInfo(Stream? input, HashType[] hashes) - => GetInfo(input, size: -1, hashes, keepReadOpen: false); - /// /// Retrieve file information for a single stream /// @@ -105,9 +96,16 @@ namespace SabreTools.FileTypes try { - // If we want to automatically set the size - if (size == -1) - size = input.Length; + try + { + // If we want to automatically set the size + if (size == -1) + size = input.Length; + } + catch + { + // Don't set the length if the stream doesn't support it + } // Run the hashing on the input stream var hashDict = HashTool.GetStreamHashes(input, hashes);