From de59d0252c7d158437d57aa8ef5fa5e1442ca140 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Wed, 28 Feb 2024 21:59:13 -0500 Subject: [PATCH] Support ancient .NET in FileTypes --- SabreTools.DatFiles/ItemDictionary.cs | 8 +++ SabreTools.DatFiles/ItemDictionaryDB.cs | 8 +++ SabreTools.DatTools/DatFileTool.cs | 32 ++++++++++ SabreTools.DatTools/DatFromDir.cs | 16 +++++ SabreTools.DatTools/Rebuilder.cs | 4 ++ SabreTools.DatTools/Splitter.cs | 24 ++++++++ SabreTools.DatTools/Statistics.cs | 5 +- SabreTools.DatTools/Writer.cs | 6 +- SabreTools.FileTypes/Aaru/AaruFormat.cs | 4 ++ SabreTools.FileTypes/Aaru/ChecksumEntry.cs | 4 ++ SabreTools.FileTypes/Aaru/ChecksumHeader.cs | 6 +- SabreTools.FileTypes/Aaru/IndexEntry.cs | 6 +- SabreTools.FileTypes/Aaru/IndexHeader.cs | 4 ++ SabreTools.FileTypes/Archives/GZipArchive.cs | 15 +++++ SabreTools.FileTypes/Archives/RarArchive.cs | 23 ++++++- .../Archives/SevenZipArchive.cs | 10 ++-- SabreTools.FileTypes/Archives/TapeArchive.cs | 45 +++++++++++--- SabreTools.FileTypes/Archives/XZArchive.cs | 25 +++++++- SabreTools.FileTypes/Archives/ZipArchive.cs | 10 ++-- SabreTools.FileTypes/BaseFile.cs | 60 ++++++++++++++++++- SabreTools.FileTypes/CHD/CHDFile.cs | 4 ++ SabreTools.FileTypes/CHD/CHDFileV1.cs | 4 ++ SabreTools.FileTypes/CHD/CHDFileV2.cs | 6 +- SabreTools.FileTypes/CHD/CHDFileV3.cs | 6 +- SabreTools.FileTypes/CHD/CHDFileV4.cs | 4 ++ SabreTools.FileTypes/CHD/CHDFileV5.cs | 4 ++ .../Compress/CompressUtils.cs | 5 +- .../Compress/SevenZip/SevenZipReadStream.cs | 6 +- .../Compress/SevenZip/SevenZipTorrent.cs | 12 ++-- .../Compress/SevenZip/SevenZipWrite.cs | 6 ++ .../Compress/SevenZip/SevenZipWriteClose.cs | 17 +++++- .../Compress/SevenZip/Structure/FileInfo.cs | 4 ++ .../Compress/SevenZip/Structure/Header.cs | 4 ++ .../SevenZip/Structure/SignatureHeader.cs | 8 +++ .../Support/Compression/zStd/zStdSharp.cs | 4 +- .../Compress/Support/Utils/ArchiveExtract.cs | 2 +- .../Compress/ThreadReaders/ThreadCRC.cs | 8 ++- SabreTools.FileTypes/Compress/ZipFile/Zip.cs | 12 ++-- .../Compress/ZipFile/ZipCentralDir.cs | 24 ++++++++ .../Compress/ZipFile/ZipLocalFile.cs | 40 ++++++++++++- SabreTools.FileTypes/Compress/gZip/gZip.cs | 14 ++++- SabreTools.FileTypes/Folder.cs | 30 ++++++++-- SabreTools.FileTypes/RVIO/RVIO.cs | 8 +++ .../SabreTools.FileTypes.csproj | 23 ++++++- SabreTools.Filtering/Cleaner.cs | 40 +++++++++++++ SabreTools.Filtering/Remover.cs | 12 +++- SabreTools.Skippers/Rule.cs | 10 +++- SabreTools/Features/Split.cs | 12 ++++ SabreTools/Features/Update.cs | 12 ++++ 49 files changed, 597 insertions(+), 59 deletions(-) diff --git a/SabreTools.DatFiles/ItemDictionary.cs b/SabreTools.DatFiles/ItemDictionary.cs index 88764ac5..ea8dce4d 100644 --- a/SabreTools.DatFiles/ItemDictionary.cs +++ b/SabreTools.DatFiles/ItemDictionary.cs @@ -1054,7 +1054,11 @@ namespace SabreTools.DatFiles // Add the list back to the dictionary Reset(key); AddRange(key, sortedlist); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } // If the merge type is the same, we want to sort the dictionary to be consistent else @@ -1068,7 +1072,11 @@ namespace SabreTools.DatFiles // Sort the list of items to be consistent if (sortedlist != null) DatItem.Sort(ref sortedlist, false); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } } diff --git a/SabreTools.DatFiles/ItemDictionaryDB.cs b/SabreTools.DatFiles/ItemDictionaryDB.cs index 45163236..f8be3d9d 100644 --- a/SabreTools.DatFiles/ItemDictionaryDB.cs +++ b/SabreTools.DatFiles/ItemDictionaryDB.cs @@ -1254,7 +1254,11 @@ CREATE TABLE IF NOT EXISTS groups ( // Add the list back to the dictionary Reset(key); AddRange(key, sortedlist); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } // If the merge type is the same, we want to sort the dictionary to be consistent else @@ -1268,7 +1272,11 @@ CREATE TABLE IF NOT EXISTS groups ( // Sort the list of items to be consistent if (sortedlist != null) DatItem.Sort(ref sortedlist, false); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } } diff --git a/SabreTools.DatTools/DatFileTool.cs b/SabreTools.DatTools/DatFileTool.cs index e9239e10..f51c02b4 100644 --- a/SabreTools.DatTools/DatFileTool.cs +++ b/SabreTools.DatTools/DatFileTool.cs @@ -66,7 +66,11 @@ namespace SabreTools.DatTools datFile.Items.Remove(key); datFile.Items.AddRange(key, newItems); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } /// @@ -117,7 +121,11 @@ namespace SabreTools.DatTools // Now add the new list to the key intDat.Items.Remove(key); intDat.Items.AddRange(key, newDatItems); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } // If we are matching based on Machine fields of any sort @@ -152,7 +160,11 @@ namespace SabreTools.DatTools // Now add the new list to the key intDat.Items.Remove(key); intDat.Items.AddRange(key, newDatItems); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } watch.Stop(); @@ -234,7 +246,11 @@ namespace SabreTools.DatTools intDat.Items.Remove(key); intDat.Items.AddRange(key, keepDatItems); } +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif watch.Stop(); } @@ -336,7 +352,11 @@ namespace SabreTools.DatTools dupeData.Items.Add(key, newrom); } } +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif watch.Stop(); @@ -412,7 +432,11 @@ namespace SabreTools.DatTools if (item.DupeType.HasFlag(DupeType.Internal) || item.DupeType == 0x00) outDats[item.Source.Index].Items.Add(key, item); } +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif watch.Stop(); @@ -481,7 +505,11 @@ namespace SabreTools.DatTools outerDiffData.Items.Add(key, newrom); } } +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif watch.Stop(); @@ -581,7 +609,11 @@ namespace SabreTools.DatTools if (item.Source != null && item.Source.Index == index) indexDat.Items.Add(key, item); } +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } } } diff --git a/SabreTools.DatTools/DatFromDir.cs b/SabreTools.DatTools/DatFromDir.cs index c6f19ae6..e1792360 100644 --- a/SabreTools.DatTools/DatFromDir.cs +++ b/SabreTools.DatTools/DatFromDir.cs @@ -64,7 +64,11 @@ namespace SabreTools.DatTools Parallel.ForEach(files, Globals.ParallelOptions, item => { Interlocked.Add(ref totalSize, new FileInfo(item).Length); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif // Process the files in the main folder or any subfolder logger.User(totalSize, currentSize); @@ -226,7 +230,11 @@ namespace SabreTools.DatTools return; ProcessFileHelper(datFile, item, datItem, basePath, parent); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } /// @@ -252,7 +260,11 @@ namespace SabreTools.DatTools { Rom emptyRom = new(Path.Combine(empty, "_"), item); ProcessFileHelper(datFile, item, emptyRom, basePath, parent); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } /// @@ -308,7 +320,11 @@ namespace SabreTools.DatTools logger.Verbose($"Adding blank empty folder: {gamename}"); datFile.Items["null"]?.Add(new Rom(romname, gamename)); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } /// diff --git a/SabreTools.DatTools/Rebuilder.cs b/SabreTools.DatTools/Rebuilder.cs index 627956c9..c96d08b2 100644 --- a/SabreTools.DatTools/Rebuilder.cs +++ b/SabreTools.DatTools/Rebuilder.cs @@ -87,7 +87,11 @@ namespace SabreTools.DatTools directories.Add(input); } } +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif // If we don't have any directories, we want to exit if (directories.Count == 0) diff --git a/SabreTools.DatTools/Splitter.cs b/SabreTools.DatTools/Splitter.cs index d8cae698..8799a520 100644 --- a/SabreTools.DatTools/Splitter.cs +++ b/SabreTools.DatTools/Splitter.cs @@ -85,7 +85,11 @@ namespace SabreTools.DatTools extBDat.Items.Add(key, item); } } +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif // Then return both DatFiles watch.Stop(); @@ -212,7 +216,11 @@ namespace SabreTools.DatTools fieldDats[DatItemField.NULL].Items.Add(key, item); } } +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif watch.Stop(); return fieldDats; @@ -265,7 +273,11 @@ namespace SabreTools.DatTools // Then set the DAT name to be the parent directory name tempDat.Header.Name = Path.GetDirectoryName(key); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif watch.Stop(); return true; @@ -366,7 +378,11 @@ namespace SabreTools.DatTools else if (item.ItemType == ItemType.Rom && (item as Rom)!.Size >= radix) greaterThan.Items.Add(key, item); } +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif // Then return both DatFiles watch.Stop(); @@ -497,7 +513,11 @@ namespace SabreTools.DatTools Parallel.ForEach(outputTypes, Globals.ParallelOptions, itemType => { FillWithItemType(datFile, typeDats[itemType], itemType); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif watch.Stop(); return typeDats; @@ -526,7 +546,11 @@ namespace SabreTools.DatTools if (item.ItemType == itemType) indexDat.Items.Add(key, item); } +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } } } \ No newline at end of file diff --git a/SabreTools.DatTools/Statistics.cs b/SabreTools.DatTools/Statistics.cs index 262fd247..8d7b571d 100644 --- a/SabreTools.DatTools/Statistics.cs +++ b/SabreTools.DatTools/Statistics.cs @@ -182,8 +182,11 @@ namespace SabreTools.DatTools { logger.Error(ex, $"Report '{outfile}' could not be written out"); } - +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } catch (Exception ex) when (!throwOnError) { diff --git a/SabreTools.DatTools/Writer.cs b/SabreTools.DatTools/Writer.cs index d1b9d645..d8034753 100644 --- a/SabreTools.DatTools/Writer.cs +++ b/SabreTools.DatTools/Writer.cs @@ -78,6 +78,7 @@ namespace SabreTools.DatTools try { // Write out all required formats + Parallel.ForEach(outfiles.Keys, Globals.ParallelOptions, datFormat => { string outfile = outfiles[datFormat]; @@ -89,8 +90,11 @@ namespace SabreTools.DatTools { logger.Error(ex, $"Datfile '{outfile}' could not be written out"); } - +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } catch (Exception ex) when (!throwOnError) { diff --git a/SabreTools.FileTypes/Aaru/AaruFormat.cs b/SabreTools.FileTypes/Aaru/AaruFormat.cs index c0bd3cba..774d1f17 100644 --- a/SabreTools.FileTypes/Aaru/AaruFormat.cs +++ b/SabreTools.FileTypes/Aaru/AaruFormat.cs @@ -119,7 +119,11 @@ namespace SabreTools.FileTypes.Aaru { AaruFormat aif = new(); +#if NET20 || NET35 || NET40 + using (BinaryReader br = new(stream, Encoding.Default)) +#else using (BinaryReader br = new(stream, Encoding.Default, true)) +#endif { aif.Identifier = br.ReadUInt64(); aif.Application = Encoding.Unicode.GetString(br.ReadBytes(64), 0, 64); diff --git a/SabreTools.FileTypes/Aaru/ChecksumEntry.cs b/SabreTools.FileTypes/Aaru/ChecksumEntry.cs index 4df1cd59..723c3a8e 100644 --- a/SabreTools.FileTypes/Aaru/ChecksumEntry.cs +++ b/SabreTools.FileTypes/Aaru/ChecksumEntry.cs @@ -27,7 +27,11 @@ namespace SabreTools.FileTypes.Aaru { var checksumEntry = new ChecksumEntry(); +#if NET20 || NET35 || NET40 + using (var br = new BinaryReader(stream, Encoding.Default)) +#else using (var br = new BinaryReader(stream, Encoding.Default, true)) +#endif { checksumEntry.type = (AaruChecksumAlgorithm)br.ReadByte(); checksumEntry.length = br.ReadUInt32(); diff --git a/SabreTools.FileTypes/Aaru/ChecksumHeader.cs b/SabreTools.FileTypes/Aaru/ChecksumHeader.cs index c857078e..103c3892 100644 --- a/SabreTools.FileTypes/Aaru/ChecksumHeader.cs +++ b/SabreTools.FileTypes/Aaru/ChecksumHeader.cs @@ -26,7 +26,11 @@ namespace SabreTools.FileTypes.Aaru { ChecksumHeader checksumHeader = new ChecksumHeader(); - using (BinaryReader br = new BinaryReader(stream, Encoding.Default, true)) +#if NET20 || NET35 || NET40 + using (var br = new BinaryReader(stream, Encoding.Default)) +#else + using (var br = new BinaryReader(stream, Encoding.Default, true)) +#endif { checksumHeader.identifier = (AaruBlockType)br.ReadUInt32(); checksumHeader.length = br.ReadUInt32(); diff --git a/SabreTools.FileTypes/Aaru/IndexEntry.cs b/SabreTools.FileTypes/Aaru/IndexEntry.cs index 5db6bf35..06cc97db 100644 --- a/SabreTools.FileTypes/Aaru/IndexEntry.cs +++ b/SabreTools.FileTypes/Aaru/IndexEntry.cs @@ -25,7 +25,11 @@ namespace SabreTools.FileTypes.Aaru { IndexEntry indexEntry = new IndexEntry(); - using (BinaryReader br = new BinaryReader(stream, Encoding.Default, true)) +#if NET20 || NET35 || NET40 + using (var br = new BinaryReader(stream, Encoding.Default)) +#else + using (var br = new BinaryReader(stream, Encoding.Default, true)) +#endif { indexEntry.blockType = (AaruBlockType)br.ReadUInt32(); indexEntry.dataType = (AaruDataType)br.ReadUInt16(); diff --git a/SabreTools.FileTypes/Aaru/IndexHeader.cs b/SabreTools.FileTypes/Aaru/IndexHeader.cs index cb346997..0aa0e76a 100644 --- a/SabreTools.FileTypes/Aaru/IndexHeader.cs +++ b/SabreTools.FileTypes/Aaru/IndexHeader.cs @@ -25,7 +25,11 @@ namespace SabreTools.FileTypes.Aaru { var indexHeader = new IndexHeader(); +#if NET20 || NET35 || NET40 + using (var br = new BinaryReader(stream, Encoding.Default)) +#else using (var br = new BinaryReader(stream, Encoding.Default, true)) +#endif { indexHeader.identifier = (AaruBlockType)br.ReadUInt32(); indexHeader.entries = br.ReadUInt16(); diff --git a/SabreTools.FileTypes/Archives/GZipArchive.cs b/SabreTools.FileTypes/Archives/GZipArchive.cs index d172fad2..f7822afd 100644 --- a/SabreTools.FileTypes/Archives/GZipArchive.cs +++ b/SabreTools.FileTypes/Archives/GZipArchive.cs @@ -94,7 +94,16 @@ namespace SabreTools.FileTypes.Archives var gz = new gZip(); ZipReturn ret = gz.ZipFileOpen(this.Filename); ret = gz.ZipFileOpenReadStream(0, out Stream gzstream, out ulong streamSize); +#if NET20 || NET35 + byte[] buffer = new byte[32768]; + int read; + while ((read = gzstream.Read(buffer, 0, buffer.Length)) > 0) + { + outstream.Write(buffer, 0, read); + } +#else gzstream.CopyTo(outstream); +#endif // Dispose of the streams outstream.Dispose(); @@ -319,7 +328,9 @@ namespace SabreTools.FileTypes.Archives br.ReadBytes(16); // headermd5 br.ReadBytes(4); // headercrc br.ReadUInt64(); // headersz +#if NET40_OR_GREATER br.Dispose(); +#endif // If the header is not correct, return a blank rom bool correct = true; @@ -382,7 +393,9 @@ namespace SabreTools.FileTypes.Archives headermd5 = br.ReadBytes(16); headercrc = br.ReadBytes(4); headersz = br.ReadUInt64(); +#if NET40_OR_GREATER br.Dispose(); +#endif // If the header is not correct, return a blank rom bool correct = true; @@ -497,7 +510,9 @@ namespace SabreTools.FileTypes.Archives sw.Write((uint)(baseFile.Size ?? 0)); // Dispose of everything +#if NET40_OR_GREATER sw.Dispose(); +#endif outputStream.Dispose(); } diff --git a/SabreTools.FileTypes/Archives/RarArchive.cs b/SabreTools.FileTypes/Archives/RarArchive.cs index d5c557ce..90b7b7f1 100644 --- a/SabreTools.FileTypes/Archives/RarArchive.cs +++ b/SabreTools.FileTypes/Archives/RarArchive.cs @@ -2,11 +2,12 @@ using System.Collections.Generic; using System.IO; using System.Linq; - using SabreTools.Core; +#if NET462_OR_GREATER || NETCOREAPP using SharpCompress.Archives; using SharpCompress.Archives.Rar; using SharpCompress.Readers; +#endif namespace SabreTools.FileTypes.Archives { @@ -45,6 +46,7 @@ namespace SabreTools.FileTypes.Archives /// public override bool CopyAll(string outDir) { +#if NET462_OR_GREATER || NETCOREAPP bool encounteredErrors = true; // If we have an invalid file @@ -82,6 +84,10 @@ namespace SabreTools.FileTypes.Archives } return encounteredErrors; +#else + // TODO: Support RAR archives in old .NET + return true; +#endif } /// @@ -128,6 +134,7 @@ namespace SabreTools.FileTypes.Archives /// public override (MemoryStream?, string?) CopyToStream(string entryName) { +#if NET462_OR_GREATER || NETCOREAPP MemoryStream? ms = new(); string? realEntry = null; @@ -157,6 +164,10 @@ namespace SabreTools.FileTypes.Archives } return (ms, realEntry); +#else + // TODO: Support RAR archives in old .NET + return (null, null); +#endif } #endregion @@ -166,6 +177,7 @@ namespace SabreTools.FileTypes.Archives /// public override List? GetChildren() { +#if NET462_OR_GREATER || NETCOREAPP // If we have an invalid file if (this.Filename == null) return null; @@ -211,11 +223,16 @@ namespace SabreTools.FileTypes.Archives } return found; +#else + // TODO: Support RAR archives in old .NET + return null; +#endif } /// public override List GetEmptyFolders() { +#if NET462_OR_GREATER || NETCOREAPP List empties = []; // If we have an invalid file @@ -251,6 +268,10 @@ namespace SabreTools.FileTypes.Archives } return empties; +#else + // TODO: Support RAR archives in old .NET + return []; +#endif } /// diff --git a/SabreTools.FileTypes/Archives/SevenZipArchive.cs b/SabreTools.FileTypes/Archives/SevenZipArchive.cs index 50c56988..32c674f1 100644 --- a/SabreTools.FileTypes/Archives/SevenZipArchive.cs +++ b/SabreTools.FileTypes/Archives/SevenZipArchive.cs @@ -119,7 +119,7 @@ namespace SabreTools.FileTypes.Archives zr = zf.ZipFileOpenReadStream(i, out Stream readStream, out ulong streamsize); // Create the rest of the path, if needed - if (!string.IsNullOrWhiteSpace(Path.GetDirectoryName(zf.GetLocalFile(i).Filename))) + if (!string.IsNullOrEmpty(Path.GetDirectoryName(zf.GetLocalFile(i).Filename))) Directory.CreateDirectory(Path.Combine(outDir, Path.GetDirectoryName(zf.GetLocalFile(i).Filename)!)); // If the entry ends with a directory separator, continue to the next item, if any @@ -492,7 +492,7 @@ namespace SabreTools.FileTypes.Archives ulong istreamSize = (ulong)(inputStream.Length); DateTime dt = DateTime.Now; - if (UseDates && !string.IsNullOrWhiteSpace(baseFile.Date) && DateTime.TryParse(baseFile.Date.Replace('\\', '/'), out dt)) + if (UseDates && !string.IsNullOrEmpty(baseFile.Date) && DateTime.TryParse(baseFile.Date.Replace('\\', '/'), out dt)) { long msDosDateTime = DateTimeHelper.ConvertToMsDosTimeFormat(dt); TimeStamps ts = new() { ModTime = msDosDateTime }; @@ -571,7 +571,7 @@ namespace SabreTools.FileTypes.Archives ulong istreamSize = (ulong)(inputStream.Length); DateTime dt = DateTime.Now; - if (UseDates && !string.IsNullOrWhiteSpace(baseFile.Date) && DateTime.TryParse(baseFile.Date.Replace('\\', '/'), out dt)) + if (UseDates && !string.IsNullOrEmpty(baseFile.Date) && DateTime.TryParse(baseFile.Date.Replace('\\', '/'), out dt)) { long msDosDateTime = DateTimeHelper.ConvertToMsDosTimeFormat(dt); TimeStamps ts = new() { ModTime = msDosDateTime }; @@ -715,7 +715,7 @@ namespace SabreTools.FileTypes.Archives ulong istreamSize = (ulong)new FileInfo(inputFiles[index]).Length; DateTime dt = DateTime.Now; - if (UseDates && !string.IsNullOrWhiteSpace(baseFiles[index].Date) && DateTime.TryParse(baseFiles[index].Date?.Replace('\\', '/'), out dt)) + if (UseDates && !string.IsNullOrEmpty(baseFiles[index].Date) && DateTime.TryParse(baseFiles[index].Date?.Replace('\\', '/'), out dt)) { long msDosDateTime = DateTimeHelper.ConvertToMsDosTimeFormat(dt); TimeStamps ts = new() { ModTime = msDosDateTime }; @@ -799,7 +799,7 @@ namespace SabreTools.FileTypes.Archives ulong istreamSize = (ulong)(new FileInfo(inputFiles[-index - 1]).Length); DateTime dt = DateTime.Now; - if (UseDates && !string.IsNullOrWhiteSpace(baseFiles[-index - 1].Date) && DateTime.TryParse(baseFiles[-index - 1].Date?.Replace('\\', '/'), out dt)) + if (UseDates && !string.IsNullOrEmpty(baseFiles[-index - 1].Date) && DateTime.TryParse(baseFiles[-index - 1].Date?.Replace('\\', '/'), out dt)) { long msDosDateTime = DateTimeHelper.ConvertToMsDosTimeFormat(dt); TimeStamps ts = new() { ModTime = msDosDateTime }; diff --git a/SabreTools.FileTypes/Archives/TapeArchive.cs b/SabreTools.FileTypes/Archives/TapeArchive.cs index 44b0a35e..8635662c 100644 --- a/SabreTools.FileTypes/Archives/TapeArchive.cs +++ b/SabreTools.FileTypes/Archives/TapeArchive.cs @@ -2,15 +2,16 @@ using System.Collections.Generic; using System.IO; using System.Linq; - using SabreTools.Core; using SabreTools.Core.Tools; using Compress; +#if NET462_OR_GREATER || NETCOREAPP using SharpCompress.Archives; using SharpCompress.Archives.Tar; using SharpCompress.Common; using SharpCompress.Readers; using SharpCompress.Writers; +#endif namespace SabreTools.FileTypes.Archives { @@ -50,6 +51,7 @@ namespace SabreTools.FileTypes.Archives /// public override bool CopyAll(string outDir) { +#if NET462_OR_GREATER || NETCOREAPP bool encounteredErrors = true; try @@ -83,6 +85,10 @@ namespace SabreTools.FileTypes.Archives } return encounteredErrors; +#else + // TODO: Support tape archives in old .NET + return true; +#endif } /// @@ -129,6 +135,7 @@ namespace SabreTools.FileTypes.Archives /// public override (MemoryStream?, string?) CopyToStream(string entryName) { +#if NET462_OR_GREATER || NETCOREAPP MemoryStream? ms = new(); string? realEntry = null; @@ -154,6 +161,10 @@ namespace SabreTools.FileTypes.Archives } return (ms, realEntry); +#else + // TODO: Support tape archives in old .NET + return (null, null); +#endif } #endregion @@ -163,7 +174,8 @@ namespace SabreTools.FileTypes.Archives /// public override List? GetChildren() { - List found = new(); +#if NET462_OR_GREATER || NETCOREAPP + List found = []; string? gamename = Path.GetFileNameWithoutExtension(this.Filename); try @@ -204,12 +216,17 @@ namespace SabreTools.FileTypes.Archives } return found; +#else + // TODO: Support tape archives in old .NET + return null; +#endif } /// public override List GetEmptyFolders() { - List empties = new(); +#if NET462_OR_GREATER || NETCOREAPP + List empties = []; try { @@ -240,6 +257,10 @@ namespace SabreTools.FileTypes.Archives } return empties; +#else + // TODO: Support tape archives in old .NET + return []; +#endif } /// @@ -262,6 +283,7 @@ namespace SabreTools.FileTypes.Archives /// public override bool Write(Stream? inputStream, string outDir, BaseFile? baseFile) { +#if NET462_OR_GREATER || NETCOREAPP bool success = false; string tempFile = Path.Combine(outDir, $"tmp{Guid.NewGuid()}"); @@ -291,7 +313,7 @@ namespace SabreTools.FileTypes.Archives { // Get temporary date-time if possible DateTime? usableDate = null; - if (UseDates && !string.IsNullOrWhiteSpace(baseFile.Date) && DateTime.TryParse(baseFile.Date.Replace('\\', '/'), out DateTime dt)) + if (UseDates && !string.IsNullOrEmpty(baseFile.Date) && DateTime.TryParse(baseFile.Date.Replace('\\', '/'), out DateTime dt)) usableDate = dt; // Copy the input stream to the output @@ -340,7 +362,7 @@ namespace SabreTools.FileTypes.Archives // Get temporary date-time if possible DateTime? usableDate = null; - if (UseDates && !string.IsNullOrWhiteSpace(baseFile.Date) && DateTime.TryParse(baseFile.Date.Replace('\\', '/'), out DateTime dt)) + if (UseDates && !string.IsNullOrEmpty(baseFile.Date) && DateTime.TryParse(baseFile.Date.Replace('\\', '/'), out DateTime dt)) usableDate = dt; // If we have the input file, add it now @@ -388,11 +410,16 @@ namespace SabreTools.FileTypes.Archives File.Move(tempFile, archiveFileName); return success; +#else + // TODO: Support tape archives in old .NET + return false; +#endif } /// public override bool Write(List inputFiles, string outDir, List? baseFiles) { +#if NET462_OR_GREATER || NETCOREAPP bool success = false; string tempFile = Path.Combine(outDir, $"tmp{Guid.NewGuid()}"); @@ -454,7 +481,7 @@ namespace SabreTools.FileTypes.Archives // Get temporary date-time if possible DateTime? usableDate = null; - if (UseDates && !string.IsNullOrWhiteSpace(baseFiles[index].Date) && DateTime.TryParse(baseFiles[index].Date?.Replace('\\', '/'), out DateTime dt)) + if (UseDates && !string.IsNullOrEmpty(baseFiles[index].Date) && DateTime.TryParse(baseFiles[index].Date?.Replace('\\', '/'), out DateTime dt)) usableDate = dt; // Copy the input stream to the output @@ -512,7 +539,7 @@ namespace SabreTools.FileTypes.Archives { // Get temporary date-time if possible DateTime? usableDate = null; - if (UseDates && !string.IsNullOrWhiteSpace(baseFiles[-index - 1].Date) && DateTime.TryParse(baseFiles[-index - 1].Date?.Replace('\\', '/'), out DateTime dt)) + if (UseDates && !string.IsNullOrEmpty(baseFiles[-index - 1].Date) && DateTime.TryParse(baseFiles[-index - 1].Date?.Replace('\\', '/'), out DateTime dt)) usableDate = dt; // Copy the input file to the output @@ -557,6 +584,10 @@ namespace SabreTools.FileTypes.Archives File.Move(tempFile, archiveFileName); return true; +#else + // TODO: Support tape archives in old .NET + return false; +#endif } #endregion diff --git a/SabreTools.FileTypes/Archives/XZArchive.cs b/SabreTools.FileTypes/Archives/XZArchive.cs index cffd9d10..8f38fd2f 100644 --- a/SabreTools.FileTypes/Archives/XZArchive.cs +++ b/SabreTools.FileTypes/Archives/XZArchive.cs @@ -2,11 +2,12 @@ using System.Collections.Generic; using System.IO; using System.Text.RegularExpressions; - using SabreTools.Core; using SabreTools.Core.Tools; using SabreTools.IO; +#if NET462_OR_GREATER || NETCOREAPP using SharpCompress.Compressors.Xz; +#endif namespace SabreTools.FileTypes.Archives { @@ -67,6 +68,7 @@ namespace SabreTools.FileTypes.Archives /// public override bool CopyAll(string outDir) { +#if NET462_OR_GREATER || NETCOREAPP bool encounteredErrors = true; try @@ -102,6 +104,10 @@ namespace SabreTools.FileTypes.Archives } return encounteredErrors; +#else + // TODO: Support XZ archives in old .NET + return true; +#endif } /// @@ -148,6 +154,7 @@ namespace SabreTools.FileTypes.Archives /// public override (MemoryStream?, string?) CopyToStream(string entryName) { +#if NET462_OR_GREATER || NETCOREAPP MemoryStream? ms = new(); string? realEntry; @@ -178,6 +185,10 @@ namespace SabreTools.FileTypes.Archives } return (ms, realEntry); +#else + // TODO: Support XZ archives in old .NET + return (null, null); +#endif } #endregion @@ -187,9 +198,10 @@ namespace SabreTools.FileTypes.Archives /// public override List? GetChildren() { +#if NET462_OR_GREATER || NETCOREAPP if (_children == null || _children.Count == 0) { - _children = new List(); + _children = []; string? gamename = Path.GetFileNameWithoutExtension(this.Filename); @@ -239,6 +251,10 @@ namespace SabreTools.FileTypes.Archives } return _children; +#else + // TODO: Support XZ archives in old .NET + return []; +#endif } /// @@ -320,6 +336,7 @@ namespace SabreTools.FileTypes.Archives /// public override bool Write(Stream? inputStream, string outDir, BaseFile? baseFile) { +#if NET462_OR_GREATER || NETCOREAPP bool success = false; // If the stream is not readable, return @@ -355,6 +372,10 @@ namespace SabreTools.FileTypes.Archives } return true; +#else + // TODO: Support XZ archives in old .NET + return false; +#endif } /// diff --git a/SabreTools.FileTypes/Archives/ZipArchive.cs b/SabreTools.FileTypes/Archives/ZipArchive.cs index 0d902513..5a90b622 100644 --- a/SabreTools.FileTypes/Archives/ZipArchive.cs +++ b/SabreTools.FileTypes/Archives/ZipArchive.cs @@ -91,7 +91,7 @@ namespace SabreTools.FileTypes.Archives zr = zf.ZipFileOpenReadStream(i, false, out Stream? readStream, out ulong streamsize, out ushort cm); // Create the rest of the path, if needed - if (!string.IsNullOrWhiteSpace(Path.GetDirectoryName(zf.GetLocalFile(i).Filename))) + if (!string.IsNullOrEmpty(Path.GetDirectoryName(zf.GetLocalFile(i).Filename))) { Directory.CreateDirectory(Path.Combine(outDir, Path.GetDirectoryName(zf.GetLocalFile(i).Filename)!)); } @@ -450,7 +450,7 @@ namespace SabreTools.FileTypes.Archives ulong istreamSize = (ulong)(inputStream.Length); DateTime dt = DateTime.Now; - if (UseDates && !string.IsNullOrWhiteSpace(baseFile.Date) && DateTime.TryParse(baseFile.Date.Replace('\\', '/'), out dt)) + if (UseDates && !string.IsNullOrEmpty(baseFile.Date) && DateTime.TryParse(baseFile.Date.Replace('\\', '/'), out dt)) { long msDosDateTime = DateTimeHelper.ConvertToMsDosTimeFormat(dt); TimeStamps ts = new() { ModTime = msDosDateTime }; @@ -524,7 +524,7 @@ namespace SabreTools.FileTypes.Archives ulong istreamSize = (ulong)(inputStream.Length); DateTime dt = DateTime.Now; - if (UseDates && !string.IsNullOrWhiteSpace(baseFile.Date) && DateTime.TryParse(baseFile.Date.Replace('\\', '/'), out dt)) + if (UseDates && !string.IsNullOrEmpty(baseFile.Date) && DateTime.TryParse(baseFile.Date.Replace('\\', '/'), out dt)) { long msDosDateTime = DateTimeHelper.ConvertToMsDosTimeFormat(dt); TimeStamps ts = new() { ModTime = msDosDateTime }; @@ -666,7 +666,7 @@ namespace SabreTools.FileTypes.Archives ulong istreamSize = (ulong)(new FileInfo(inputFiles[index]).Length); DateTime dt = DateTime.Now; - if (UseDates && !string.IsNullOrWhiteSpace(baseFiles[index].Date) && DateTime.TryParse(baseFiles[index].Date?.Replace('\\', '/'), out dt)) + if (UseDates && !string.IsNullOrEmpty(baseFiles[index].Date) && DateTime.TryParse(baseFiles[index].Date?.Replace('\\', '/'), out dt)) { long msDosDateTime = DateTimeHelper.ConvertToMsDosTimeFormat(dt); TimeStamps ts = new() { ModTime = msDosDateTime }; @@ -750,7 +750,7 @@ namespace SabreTools.FileTypes.Archives ulong istreamSize = (ulong)(new FileInfo(inputFiles[-index - 1]).Length); DateTime dt = DateTime.Now; - if (UseDates && !string.IsNullOrWhiteSpace(baseFiles[-index - 1].Date) && DateTime.TryParse(baseFiles[-index - 1].Date?.Replace('\\', '/'), out dt)) + if (UseDates && !string.IsNullOrEmpty(baseFiles[-index - 1].Date) && DateTime.TryParse(baseFiles[-index - 1].Date?.Replace('\\', '/'), out dt)) { long msDosDateTime = DateTimeHelper.ConvertToMsDosTimeFormat(dt); TimeStamps ts = new() { ModTime = msDosDateTime }; diff --git a/SabreTools.FileTypes/BaseFile.cs b/SabreTools.FileTypes/BaseFile.cs index 0917055c..d9d4a8a4 100644 --- a/SabreTools.FileTypes/BaseFile.cs +++ b/SabreTools.FileTypes/BaseFile.cs @@ -201,7 +201,9 @@ namespace SabreTools.FileTypes // Read the first bytes of the file and get the magic number BinaryReader br = new(File.OpenRead(input)); byte[] magic = br.ReadBytes(8); +#if NET40_OR_GREATER br.Dispose(); +#endif // Now try to match it to a known signature if (magic.StartsWith(SevenZipSignature)) @@ -300,10 +302,17 @@ namespace SabreTools.FileTypes // Get the info in the proper manner BaseFile? baseFile; +#if NETFRAMEWORK + if (fileType == FileType.AaruFormat && (asFiles & TreatAsFile.AaruFormat) == 0) + baseFile = AaruFormat.Create(inputStream); + else if (fileType == FileType.CHD && (asFiles & TreatAsFile.CHD) == 0) + baseFile = CHDFile.Create(inputStream); +#else if (fileType == FileType.AaruFormat && !asFiles.HasFlag(TreatAsFile.AaruFormat)) baseFile = AaruFormat.Create(inputStream); else if (fileType == FileType.CHD && !asFiles.HasFlag(TreatAsFile.CHD)) baseFile = CHDFile.Create(inputStream); +#endif else baseFile = GetInfo(inputStream, hashes: hashes, keepReadOpen: false); @@ -340,6 +349,22 @@ namespace SabreTools.FileTypes // Get a list of hashers to run over the buffer List hashers = []; +#if NETFRAMEWORK + if ((hashes & Hash.CRC) != 0) + hashers.Add(new Hasher(Hash.CRC)); + if ((hashes & Hash.MD5) != 0) + hashers.Add(new Hasher(Hash.MD5)); + if ((hashes & Hash.SHA1) != 0) + hashers.Add(new Hasher(Hash.SHA1)); + if ((hashes & Hash.SHA256) != 0) + hashers.Add(new Hasher(Hash.SHA256)); + if ((hashes & Hash.SHA384) != 0) + hashers.Add(new Hasher(Hash.SHA384)); + if ((hashes & Hash.SHA512) != 0) + hashers.Add(new Hasher(Hash.SHA512)); + if ((hashes & Hash.SpamSum) != 0) + hashers.Add(new Hasher(Hash.SpamSum)); +#else if (hashes.HasFlag(Hash.CRC)) hashers.Add(new Hasher(Hash.CRC)); if (hashes.HasFlag(Hash.MD5)) @@ -354,6 +379,7 @@ namespace SabreTools.FileTypes hashers.Add(new Hasher(Hash.SHA512)); if (hashes.HasFlag(Hash.SpamSum)) hashers.Add(new Hasher(Hash.SpamSum)); +#endif // Initialize the hashing helpers int buffersize = 3 * 1024 * 1024; @@ -376,7 +402,16 @@ namespace SabreTools.FileTypes { // Run hashes in parallel if (current > 0) +#if NET452_OR_GREATER || NETCOREAPP Parallel.ForEach(hashers, Globals.ParallelOptions, h => h.Process(buffer, current)); +#elif NET40_OR_GREATER + Parallel.ForEach(hashers, h => h.Process(buffer, current)); +#else + foreach (var h in hashers) + { + h.Process(buffer, current); + } +#endif // Load the next buffer refsize -= current; @@ -391,12 +426,30 @@ namespace SabreTools.FileTypes } // Finalize all hashing helpers +#if NET452_OR_GREATER || NETCOREAPP Parallel.ForEach(hashers, Globals.ParallelOptions, h => h.Terminate()); +#elif NET40_OR_GREATER + Parallel.ForEach(hashers, h => h.Terminate()); +#else + foreach (var h in hashers) + { + h.Terminate(); + } +#endif // Get the results BaseFile baseFile = new() { Size = size, +#if NETFRAMEWORK + CRC = (hashes & Hash.CRC) != 0 ? hashers.First(h => h.HashType == Hash.CRC).GetHash() : null, + MD5 = (hashes & Hash.MD5) != 0 ? hashers.First(h => h.HashType == Hash.MD5).GetHash() : null, + SHA1 = (hashes & Hash.SHA1) != 0 ? hashers.First(h => h.HashType == Hash.SHA1).GetHash() : null, + SHA256 = (hashes & Hash.SHA256) != 0 ? hashers.First(h => h.HashType == Hash.SHA256).GetHash() : null, + SHA384 = (hashes & Hash.SHA384) != 0 ? hashers.First(h => h.HashType == Hash.SHA384).GetHash() : null, + SHA512 = (hashes & Hash.SHA512) != 0 ? hashers.First(h => h.HashType == Hash.SHA512).GetHash() : null, + SpamSum = (hashes & Hash.SpamSum) != 0 ? hashers.First(h => h.HashType == Hash.SpamSum).GetHash() : null, +#else CRC = hashes.HasFlag(Hash.CRC) ? hashers.First(h => h.HashType == Hash.CRC).GetHash() : null, MD5 = hashes.HasFlag(Hash.MD5) ? hashers.First(h => h.HashType == Hash.MD5).GetHash() : null, SHA1 = hashes.HasFlag(Hash.SHA1) ? hashers.First(h => h.HashType == Hash.SHA1).GetHash() : null, @@ -404,6 +457,7 @@ namespace SabreTools.FileTypes SHA384 = hashes.HasFlag(Hash.SHA384) ? hashers.First(h => h.HashType == Hash.SHA384).GetHash() : null, SHA512 = hashes.HasFlag(Hash.SHA512) ? hashers.First(h => h.HashType == Hash.SHA512).GetHash() : null, SpamSum = hashes.HasFlag(Hash.SpamSum) ? hashers.First(h => h.HashType == Hash.SpamSum).GetHash() : null, +#endif }; // Dispose of the hashers @@ -444,7 +498,7 @@ namespace SabreTools.FileTypes "aaruformat" => true, "aif" => true, "dicf" => true, - + // Archive "7z" => true, "gz" => true, @@ -458,10 +512,10 @@ namespace SabreTools.FileTypes "tlz" => true, "zip" => true, "zipx" => true, - + // CHD "chd" => true, - + _ => false, }; } diff --git a/SabreTools.FileTypes/CHD/CHDFile.cs b/SabreTools.FileTypes/CHD/CHDFile.cs index 2196adbd..ae973d74 100644 --- a/SabreTools.FileTypes/CHD/CHDFile.cs +++ b/SabreTools.FileTypes/CHD/CHDFile.cs @@ -94,7 +94,11 @@ namespace SabreTools.FileTypes.CHD uint parsedLength = 0; uint parsedVersion = 0; +#if NET20 || NET35 || NET40 + using (BinaryReader br = new(stream, Encoding.Default)) +#else using (BinaryReader br = new(stream, Encoding.Default, true)) +#endif { parsedTag = br.ReadChars(8); parsedLength = br.ReadUInt32BigEndian(); diff --git a/SabreTools.FileTypes/CHD/CHDFileV1.cs b/SabreTools.FileTypes/CHD/CHDFileV1.cs index 11e26618..4e3911dc 100644 --- a/SabreTools.FileTypes/CHD/CHDFileV1.cs +++ b/SabreTools.FileTypes/CHD/CHDFileV1.cs @@ -60,7 +60,11 @@ namespace SabreTools.FileTypes.CHD { CHDFileV1 chd = new(); +#if NET20 || NET35 || NET40 + using (BinaryReader br = new(stream, Encoding.Default)) +#else using (BinaryReader br = new(stream, Encoding.Default, true)) +#endif { chd.tag = br.ReadChars(8); chd.length = br.ReadUInt32BigEndian(); diff --git a/SabreTools.FileTypes/CHD/CHDFileV2.cs b/SabreTools.FileTypes/CHD/CHDFileV2.cs index 8438e940..87e3d52e 100644 --- a/SabreTools.FileTypes/CHD/CHDFileV2.cs +++ b/SabreTools.FileTypes/CHD/CHDFileV2.cs @@ -61,7 +61,11 @@ namespace SabreTools.FileTypes.CHD { CHDFileV2 chd = new(); - using (BinaryReader br = new(stream, Encoding.Default, true)) +#if NET20 || NET35 || NET40 + using (var br = new BinaryReader(stream, Encoding.Default)) +#else + using (var br = new BinaryReader(stream, Encoding.Default, true)) +#endif { chd.tag = br.ReadChars(8); chd.length = br.ReadUInt32BigEndian(); diff --git a/SabreTools.FileTypes/CHD/CHDFileV3.cs b/SabreTools.FileTypes/CHD/CHDFileV3.cs index f3312587..d1fcf080 100644 --- a/SabreTools.FileTypes/CHD/CHDFileV3.cs +++ b/SabreTools.FileTypes/CHD/CHDFileV3.cs @@ -65,7 +65,11 @@ namespace SabreTools.FileTypes.CHD { CHDFileV3 chd = new(); - using (BinaryReader br = new(stream, Encoding.Default, true)) +#if NET20 || NET35 || NET40 + using (var br = new BinaryReader(stream, Encoding.Default)) +#else + using (var br = new BinaryReader(stream, Encoding.Default, true)) +#endif { chd.tag = br.ReadChars(8); chd.length = br.ReadUInt32BigEndian(); diff --git a/SabreTools.FileTypes/CHD/CHDFileV4.cs b/SabreTools.FileTypes/CHD/CHDFileV4.cs index bc1fe9ff..23621e0a 100644 --- a/SabreTools.FileTypes/CHD/CHDFileV4.cs +++ b/SabreTools.FileTypes/CHD/CHDFileV4.cs @@ -65,7 +65,11 @@ namespace SabreTools.FileTypes.CHD { CHDFileV4 chd = new(); +#if NET20 || NET35 || NET40 + using (BinaryReader br = new(stream, Encoding.Default)) +#else using (BinaryReader br = new(stream, Encoding.Default, true)) +#endif { chd.tag = br.ReadChars(8); chd.length = br.ReadUInt32BigEndian(); diff --git a/SabreTools.FileTypes/CHD/CHDFileV5.cs b/SabreTools.FileTypes/CHD/CHDFileV5.cs index a50658e0..f45a2d5a 100644 --- a/SabreTools.FileTypes/CHD/CHDFileV5.cs +++ b/SabreTools.FileTypes/CHD/CHDFileV5.cs @@ -64,7 +64,11 @@ namespace SabreTools.FileTypes.CHD { CHDFileV5 chd = new CHDFileV5(); +#if NET20 || NET35 || NET40 + using (BinaryReader br = new BinaryReader(stream, Encoding.Default)) +#else using (BinaryReader br = new BinaryReader(stream, Encoding.Default, true)) +#endif { chd.tag = br.ReadChars(8); chd.length = br.ReadUInt32BigEndian(); diff --git a/SabreTools.FileTypes/Compress/CompressUtils.cs b/SabreTools.FileTypes/Compress/CompressUtils.cs index 108ea801..08799669 100644 --- a/SabreTools.FileTypes/Compress/CompressUtils.cs +++ b/SabreTools.FileTypes/Compress/CompressUtils.cs @@ -6,7 +6,7 @@ namespace Compress { public static class CompressUtils { - + public static void CreateDirForFile(string sFilename) { string strTemp = Path.GetDirectoryName(sFilename); @@ -32,7 +32,10 @@ namespace Compress { if (enc != null) return; + +#if NET462_OR_GREATER || NETCOREAPP Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); +#endif enc = Encoding.GetEncoding(437); } diff --git a/SabreTools.FileTypes/Compress/SevenZip/SevenZipReadStream.cs b/SabreTools.FileTypes/Compress/SevenZip/SevenZipReadStream.cs index 96912708..89319b5d 100644 --- a/SabreTools.FileTypes/Compress/SevenZip/SevenZipReadStream.cs +++ b/SabreTools.FileTypes/Compress/SevenZip/SevenZipReadStream.cs @@ -7,7 +7,9 @@ using Compress.SevenZip.Structure; using Compress.Support.Compression.BZip2; using Compress.Support.Compression.LZMA; using Compress.Support.Compression.PPmd; +#if NET462_OR_GREATER || NETCOREAPP using Compress.Support.Compression.zStd; +#endif using Compress.Support.Filters; using FileStream = RVIO.FileStream; @@ -163,9 +165,11 @@ namespace Compress.SevenZip case DecompressType.BCJ2: coder.DecoderStream = new BCJ2Filter(inputCoders[0], inputCoders[1], inputCoders[2], inputCoders[3]); break; +#if NET462_OR_GREATER || NETCOREAPP case DecompressType.ZSTD: - coder.DecoderStream =new zStdSharp(inputCoders[0]); + coder.DecoderStream = new zStdSharp(inputCoders[0]); break; +#endif default: return ZipReturn.ZipDecodeError; } diff --git a/SabreTools.FileTypes/Compress/SevenZip/SevenZipTorrent.cs b/SabreTools.FileTypes/Compress/SevenZip/SevenZipTorrent.cs index 439edfc0..b1e024d0 100644 --- a/SabreTools.FileTypes/Compress/SevenZip/SevenZipTorrent.cs +++ b/SabreTools.FileTypes/Compress/SevenZip/SevenZipTorrent.cs @@ -26,7 +26,7 @@ namespace Compress.SevenZip ZipStatus = ZipStatus.TrrntZip; } - private bool IsRomVault7Z(long testBaseOffset,ulong testHeaderPos,ulong testHeaderLength,uint testHeaderCRC) + private bool IsRomVault7Z(long testBaseOffset, ulong testHeaderPos, ulong testHeaderLength, uint testHeaderCRC) { long length = _zipFs.Length; if (length < 32) @@ -39,8 +39,8 @@ namespace Compress.SevenZip byte[] rv7Zid = Util.Enc.GetBytes(sig); byte[] header = new byte[12]; _zipFs.Read(header, 0, 12); - - + + for (int i = 0; i < 12; i++) { if (header[i] != rv7Zid[i]) @@ -52,7 +52,11 @@ namespace Compress.SevenZip uint headerCRC; ulong headerOffset; // is location of header in file ulong headerSize; +#if NET20 || NET35 || NET40 + using (BinaryReader br = new(_zipFs, Encoding.UTF8)) +#else using (BinaryReader br = new(_zipFs, Encoding.UTF8, true)) +#endif { headerCRC = br.ReadUInt32(); headerOffset = br.ReadUInt64(); @@ -62,7 +66,7 @@ namespace Compress.SevenZip if (headerCRC != testHeaderCRC) return false; - if (headerOffset != testHeaderPos+(ulong)testBaseOffset) + if (headerOffset != testHeaderPos + (ulong)testBaseOffset) return false; return headerSize == testHeaderLength; diff --git a/SabreTools.FileTypes/Compress/SevenZip/SevenZipWrite.cs b/SabreTools.FileTypes/Compress/SevenZip/SevenZipWrite.cs index 0582b1a1..f421b992 100644 --- a/SabreTools.FileTypes/Compress/SevenZip/SevenZipWrite.cs +++ b/SabreTools.FileTypes/Compress/SevenZip/SevenZipWrite.cs @@ -57,7 +57,11 @@ namespace Compress.SevenZip _signatureHeader = new SignatureHeader(); _header = new Header(); +#if NET20 || NET35 || NET40 + using (BinaryWriter bw = new(_zipFs, Encoding.UTF8)) +#else using (BinaryWriter bw = new(_zipFs, Encoding.UTF8, true)) +#endif { _signatureHeader.Write(bw); } @@ -179,6 +183,7 @@ namespace Compress.SevenZip _compressStream = lzs; break; +#if NET462_OR_GREATER || NETCOREAPP case SevenZipCompressType.zstd: ZstdSharp.CompressionStream zss = new(_zipFs, 19); @@ -186,6 +191,7 @@ namespace Compress.SevenZip newStream.Properties = new byte[] { 1, 5, 19, 0, 0 }; _compressStream = zss; break; +#endif case SevenZipCompressType.uncompressed: newStream.Method = new byte[] { 0 }; diff --git a/SabreTools.FileTypes/Compress/SevenZip/SevenZipWriteClose.cs b/SabreTools.FileTypes/Compress/SevenZip/SevenZipWriteClose.cs index 9dc2ba0c..c7e3556a 100644 --- a/SabreTools.FileTypes/Compress/SevenZip/SevenZipWriteClose.cs +++ b/SabreTools.FileTypes/Compress/SevenZip/SevenZipWriteClose.cs @@ -130,7 +130,11 @@ namespace Compress.SevenZip byte[] newHeaderByte; using (Stream headerMem = new MemoryStream()) { +#if NET20 || NET35 || NET40 + using BinaryWriter headerBw = new(headerMem, Encoding.UTF8); +#else using BinaryWriter headerBw = new(headerMem, Encoding.UTF8, true); +#endif _header.WriteHeader(headerBw); newHeaderByte = new byte[headerMem.Length]; @@ -140,7 +144,7 @@ namespace Compress.SevenZip uint mainHeaderCRC = CRC.CalculateDigest(newHeaderByte, 0, (uint)newHeaderByte.Length); -#region Header Compression + #region Header Compression long packedHeaderPos = _zipFs.Position; LzmaEncoderProperties ep = new(true, GetDictionarySizeFromUncompressedSize((ulong)newHeaderByte.Length), 64); LzmaStream lzs = new(ep, false, _zipFs); @@ -177,7 +181,11 @@ namespace Compress.SevenZip using (Stream headerMem = new MemoryStream()) { +#if NET20 || NET35 || NET40 + using BinaryWriter bw = new(headerMem, Encoding.UTF8); +#else using BinaryWriter bw = new(headerMem, Encoding.UTF8, true); +#endif bw.Write((byte)HeaderProperty.kEncodedHeader); streamsInfo.WriteHeader(bw); @@ -186,10 +194,13 @@ namespace Compress.SevenZip headerMem.Read(newHeaderByte, 0, newHeaderByte.Length); } mainHeaderCRC = CRC.CalculateDigest(newHeaderByte, 0, (uint)newHeaderByte.Length); -#endregion - + #endregion +#if NET20 || NET35 || NET40 + using (BinaryWriter bw = new(_zipFs, Encoding.UTF8)) +#else using (BinaryWriter bw = new(_zipFs, Encoding.UTF8, true)) +#endif { ulong headerPosition = (ulong)_zipFs.Position + 32; //tzip header is 32 bytes WriteRomVault7Zip(bw, headerPosition, (ulong)newHeaderByte.Length, mainHeaderCRC); diff --git a/SabreTools.FileTypes/Compress/SevenZip/Structure/FileInfo.cs b/SabreTools.FileTypes/Compress/SevenZip/Structure/FileInfo.cs index 7a469308..fc50f2a7 100644 --- a/SabreTools.FileTypes/Compress/SevenZip/Structure/FileInfo.cs +++ b/SabreTools.FileTypes/Compress/SevenZip/Structure/FileInfo.cs @@ -98,7 +98,11 @@ namespace Compress.SevenZip.Structure byte[] namebyte; using (MemoryStream nameMem = new()) { +#if NET20 || NET35 || NET40 + using BinaryWriter nameBw = new(nameMem, Encoding.UTF8); +#else using BinaryWriter nameBw = new(nameMem, Encoding.UTF8, true); +#endif nameBw.Write((byte)0); //not external foreach (string name in Names) { diff --git a/SabreTools.FileTypes/Compress/SevenZip/Structure/Header.cs b/SabreTools.FileTypes/Compress/SevenZip/Structure/Header.cs index 35dc24e1..2c879c1a 100644 --- a/SabreTools.FileTypes/Compress/SevenZip/Structure/Header.cs +++ b/SabreTools.FileTypes/Compress/SevenZip/Structure/Header.cs @@ -49,7 +49,11 @@ namespace Compress.SevenZip.Structure { header = null; +#if NET20 || NET35 || NET40 + using BinaryReader br = new(stream, Encoding.UTF8); +#else using BinaryReader br = new(stream, Encoding.UTF8, true); +#endif HeaderProperty hp = (HeaderProperty)br.ReadByte(); switch (hp) { diff --git a/SabreTools.FileTypes/Compress/SevenZip/Structure/SignatureHeader.cs b/SabreTools.FileTypes/Compress/SevenZip/Structure/SignatureHeader.cs index 1a4586a6..6435d22a 100644 --- a/SabreTools.FileTypes/Compress/SevenZip/Structure/SignatureHeader.cs +++ b/SabreTools.FileTypes/Compress/SevenZip/Structure/SignatureHeader.cs @@ -20,7 +20,11 @@ namespace Compress.SevenZip.Structure public bool Read(Stream stream) { +#if NET20 || NET35 || NET40 + using BinaryReader br = new(stream, Encoding.UTF8); +#else using BinaryReader br = new(stream, Encoding.UTF8, true); +#endif byte[] signatureBytes = br.ReadBytes(6); if (!signatureBytes.Compare(Signature)) { @@ -82,7 +86,11 @@ namespace Compress.SevenZip.Structure byte[] sigHeaderBytes; using (MemoryStream sigHeaderMem = new()) { +#if NET20 || NET35 || NET40 + using BinaryWriter sigHeaderBw = new(sigHeaderMem, Encoding.UTF8); +#else using BinaryWriter sigHeaderBw = new(sigHeaderMem, Encoding.UTF8, true); +#endif sigHeaderBw.Write((ulong)((long)headerpos - BaseOffset)); //NextHeaderOffset sigHeaderBw.Write(headerLength); //NextHeaderSize sigHeaderBw.Write(headerCRC); //NextHeaderCRC diff --git a/SabreTools.FileTypes/Compress/Support/Compression/zStd/zStdSharp.cs b/SabreTools.FileTypes/Compress/Support/Compression/zStd/zStdSharp.cs index bbd568de..d4375804 100644 --- a/SabreTools.FileTypes/Compress/Support/Compression/zStd/zStdSharp.cs +++ b/SabreTools.FileTypes/Compress/Support/Compression/zStd/zStdSharp.cs @@ -1,4 +1,5 @@ -using System.IO; +#if NET462_OR_GREATER || NETCOREAPP +using System.IO; namespace Compress.Support.Compression.zStd { @@ -62,3 +63,4 @@ namespace Compress.Support.Compression.zStd } } } +#endif diff --git a/SabreTools.FileTypes/Compress/Support/Utils/ArchiveExtract.cs b/SabreTools.FileTypes/Compress/Support/Utils/ArchiveExtract.cs index 75c66841..591ca24f 100644 --- a/SabreTools.FileTypes/Compress/Support/Utils/ArchiveExtract.cs +++ b/SabreTools.FileTypes/Compress/Support/Utils/ArchiveExtract.cs @@ -72,7 +72,7 @@ namespace Compress.Support.Utils MessageCallBack?.Invoke($"Extracting {filenameOut}"); string fOut = Path.Combine(outDir, filenameOut.Replace('/', '\\')); string dOut = Path.GetDirectoryName(fOut); - if (!string.IsNullOrWhiteSpace(dOut) && !Directory.Exists(dOut)) + if (!string.IsNullOrEmpty(dOut) && !Directory.Exists(dOut)) Directory.CreateDirectory(dOut); int errorCode = FileStream.OpenFileWrite(fOut, out Stream sWrite); diff --git a/SabreTools.FileTypes/Compress/ThreadReaders/ThreadCRC.cs b/SabreTools.FileTypes/Compress/ThreadReaders/ThreadCRC.cs index 8e042dd5..04ce56ed 100644 --- a/SabreTools.FileTypes/Compress/ThreadReaders/ThreadCRC.cs +++ b/SabreTools.FileTypes/Compress/ThreadReaders/ThreadCRC.cs @@ -6,7 +6,7 @@ namespace Compress.ThreadReaders { public class ThreadCRC : IDisposable { - private CRC crc; + private CRC crc; private readonly AutoResetEvent _waitEvent; private readonly AutoResetEvent _outEvent; private readonly Thread _tWorker; @@ -18,7 +18,7 @@ namespace Compress.ThreadReaders public ThreadCRC() { - crc=new CRC(); + crc = new CRC(); _waitEvent = new AutoResetEvent(false); _outEvent = new AutoResetEvent(false); _finished = false; @@ -31,8 +31,10 @@ namespace Compress.ThreadReaders public void Dispose() { +#if NET40_OR_GREATER _waitEvent.Dispose(); _outEvent.Dispose(); +#endif } private void MainLoop() @@ -45,7 +47,7 @@ namespace Compress.ThreadReaders break; } - crc.SlurpBlock(_buffer,0,_size); + crc.SlurpBlock(_buffer, 0, _size); _outEvent.Set(); } diff --git a/SabreTools.FileTypes/Compress/ZipFile/Zip.cs b/SabreTools.FileTypes/Compress/ZipFile/Zip.cs index 2b2db994..f94e8fc6 100644 --- a/SabreTools.FileTypes/Compress/ZipFile/Zip.cs +++ b/SabreTools.FileTypes/Compress/ZipFile/Zip.cs @@ -10,7 +10,7 @@ using FileInfo = RVIO.FileInfo; namespace Compress.ZipFile { public partial class Zip : ICompress - { + { private readonly List _localFiles = new(); private FileInfo? _zipFileInfo; @@ -33,7 +33,7 @@ namespace Compress.ZipFile public Zip() { - CompressUtils.EncodeSetup(); + CompressUtils.EncodeSetup(); } public ZipOpenType ZipOpen { get; private set; } @@ -56,7 +56,7 @@ namespace Compress.ZipFile { return _localFiles[i]; } - + public void ZipFileClose() { switch (ZipOpen) @@ -79,7 +79,11 @@ namespace Compress.ZipFile public void BreakTrrntZip(string filename) { _zipFs = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite); - using (BinaryReader zipBr = new BinaryReader(_zipFs,Encoding.UTF8,true)) +#if NET20 || NET35 || NET40 + using (var zipBr = new BinaryReader(_zipFs,Encoding.UTF8)) +#else + using (var zipBr = new BinaryReader(_zipFs,Encoding.UTF8,true)) +#endif { _zipFs.Position = _zipFs.Length - 22; byte[] fileComment = zipBr.ReadBytes(22); diff --git a/SabreTools.FileTypes/Compress/ZipFile/ZipCentralDir.cs b/SabreTools.FileTypes/Compress/ZipFile/ZipCentralDir.cs index bb5575d9..67fe068b 100644 --- a/SabreTools.FileTypes/Compress/ZipFile/ZipCentralDir.cs +++ b/SabreTools.FileTypes/Compress/ZipFile/ZipCentralDir.cs @@ -56,7 +56,11 @@ namespace Compress.ZipFile private ZipReturn EndOfCentralDirRead() { +#if NET20 || NET35 || NET40 + using BinaryReader zipBr = new(_zipFs, Encoding.UTF8); +#else using BinaryReader zipBr = new(_zipFs, Encoding.UTF8, true); +#endif uint thisSignature = zipBr.ReadUInt32(); if (thisSignature != EndOfCentralDirSignature) { @@ -105,7 +109,11 @@ namespace Compress.ZipFile private void EndOfCentralDirWrite() { +#if NET20 || NET35 || NET40 + using BinaryWriter bw = new(_zipFs, Encoding.UTF8); +#else using BinaryWriter bw = new(_zipFs, Encoding.UTF8, true); +#endif bw.Write(EndOfCentralDirSignature); bw.Write((ushort)0); // NumberOfThisDisk bw.Write((ushort)0); // NumberOfThisDiskCenterDir @@ -122,7 +130,11 @@ namespace Compress.ZipFile private ZipReturn Zip64EndOfCentralDirRead() { +#if NET20 || NET35 || NET40 + using BinaryReader zipBr = new(_zipFs, Encoding.UTF8); +#else using BinaryReader zipBr = new(_zipFs, Encoding.UTF8, true); +#endif uint thisSignature = zipBr.ReadUInt32(); if (thisSignature != Zip64EndOfCentralDirSignature) { @@ -174,7 +186,11 @@ namespace Compress.ZipFile private void Zip64EndOfCentralDirWrite() { +#if NET20 || NET35 || NET40 + using BinaryWriter bw = new(_zipFs, Encoding.UTF8); +#else using BinaryWriter bw = new(_zipFs, Encoding.UTF8, true); +#endif bw.Write(Zip64EndOfCentralDirSignature); bw.Write((ulong)44); // Size of zip64 end of central directory record bw.Write((ushort)45); // version made by @@ -191,7 +207,11 @@ namespace Compress.ZipFile private ZipReturn Zip64EndOfCentralDirectoryLocatorRead() { +#if NET20 || NET35 || NET40 + using BinaryReader zipBr = new(_zipFs, Encoding.UTF8); +#else using BinaryReader zipBr = new(_zipFs, Encoding.UTF8, true); +#endif uint thisSignature = zipBr.ReadUInt32(); if (thisSignature != Zip64EndOfCentralDirectoryLocator) { @@ -217,7 +237,11 @@ namespace Compress.ZipFile private void Zip64EndOfCentralDirectoryLocatorWrite() { +#if NET20 || NET35 || NET40 + using BinaryWriter bw = new(_zipFs, Encoding.UTF8); +#else using BinaryWriter bw = new(_zipFs, Encoding.UTF8, true); +#endif bw.Write(Zip64EndOfCentralDirectoryLocator); bw.Write((uint)0); // number of the disk with the start of the zip64 end of central directory bw.Write(_endOfCentralDir64); // relative offset of the zip64 end of central directory record diff --git a/SabreTools.FileTypes/Compress/ZipFile/ZipLocalFile.cs b/SabreTools.FileTypes/Compress/ZipFile/ZipLocalFile.cs index 66c6847c..8e35f7bb 100644 --- a/SabreTools.FileTypes/Compress/ZipFile/ZipLocalFile.cs +++ b/SabreTools.FileTypes/Compress/ZipFile/ZipLocalFile.cs @@ -55,7 +55,11 @@ namespace Compress.ZipFile { try { +#if NET20 || NET35 || NET40 + using BinaryReader br = new(zipFs, Encoding.UTF8); +#else using BinaryReader br = new(zipFs, Encoding.UTF8, true); +#endif uint thisSignature = br.ReadUInt32(); if (thisSignature != CentralDirectoryHeaderSignature) { @@ -156,7 +160,7 @@ namespace Compress.ZipFile switch (_compressionMethod) { case 0: // The file is stored (no compression) - + case 8: // The file is Deflated case 9: // Enhanced Deflating using Deflate64(tm) case 12: // The file is BZIP2 algorithm. @@ -182,7 +186,11 @@ namespace Compress.ZipFile internal void CentralDirectoryWrite(Stream crcStream) { +#if NET20 || NET35 || NET40 + using BinaryWriter bw = new(crcStream, Encoding.UTF8); +#else using BinaryWriter bw = new(crcStream, Encoding.UTF8, true); +#endif ZipExtraFieldWrite zefw = new(); SetStatus(LocalFileStatus.Zip64, @@ -238,7 +246,11 @@ namespace Compress.ZipFile try { +#if NET20 || NET35 || NET40 + using (BinaryReader br = new(zipFs, Encoding.UTF8)) +#else using (BinaryReader br = new(zipFs, Encoding.UTF8, true)) +#endif { SetStatus(LocalFileStatus.TrrntZip); @@ -368,7 +380,11 @@ namespace Compress.ZipFile try { +#if NET20 || NET35 || NET40 + using BinaryReader br = new(zipFs, Encoding.UTF8); +#else using BinaryReader br = new(zipFs, Encoding.UTF8, true); +#endif SetStatus(LocalFileStatus.TrrntZip); zipFs.Position = (long)RelativeOffsetOfLocalHeader; @@ -431,7 +447,11 @@ namespace Compress.ZipFile private void LocalFileHeaderWrite(Stream zipFs) { +#if NET20 || NET35 || NET40 + using BinaryWriter bw = new(zipFs, Encoding.UTF8); +#else using BinaryWriter bw = new(zipFs, Encoding.UTF8, true); +#endif ZipExtraFieldWrite zefw = new(); bool zip64 = zefw.Zip64(UncompressedSize, _compressedSize, RelativeOffsetOfLocalHeader, false, out uint headerUnCompressedSize, out uint headerCompressedSize, @@ -505,7 +525,11 @@ namespace Compress.ZipFile long posNow = zipFs.Position; zipFs.Seek((long)RelativeOffsetOfLocalHeader + 14, SeekOrigin.Begin); +#if NET20 || NET35 || NET40 + using (BinaryWriter bw = new(zipFs, Encoding.UTF8)) +#else using (BinaryWriter bw = new(zipFs, Encoding.UTF8, true)) +#endif { WriteCRC(bw, CRC); bw.Write(headerCompressedSize); @@ -524,7 +548,11 @@ namespace Compress.ZipFile internal void LocalFileHeaderFake(ulong filePosition, ulong uncompressedSize, ulong compressedSize, byte[] crc32, MemoryStream ms) { +#if NET20 || NET35 || NET40 + using BinaryWriter bw = new(ms, Encoding.UTF8); +#else using BinaryWriter bw = new(ms, Encoding.UTF8, true); +#endif RelativeOffsetOfLocalHeader = filePosition; SetStatus(LocalFileStatus.TrrntZip); UncompressedSize = uncompressedSize; @@ -580,7 +608,7 @@ namespace Compress.ZipFile compressionMethod = _compressionMethod; readStream = null; - + if (zipFs == null) return ZipReturn.ZipErrorFileNotFound; @@ -634,11 +662,13 @@ namespace Compress.ZipFile break; } +#if NET462_OR_GREATER || NETCOREAPP case 20: case 93: readStream = new ZstdSharp.DecompressionStream(zipFs); streamSize = UncompressedSize; break; +#endif case 98: { @@ -675,10 +705,12 @@ namespace Compress.ZipFile { writeStream = zipFs; } +#if NET462_OR_GREATER || NETCOREAPP else if (compressionMethod == 93) { writeStream = new ZstdSharp.CompressionStream(zipFs, 19); } +#endif else if (compressionMethod == 8) { writeStream = new ZlibBaseStream(zipFs, CompressionMode.Compress, CompressionLevel.BestCompression, ZlibStreamFlavor.DEFLATE, true); @@ -712,7 +744,11 @@ namespace Compress.ZipFile private void FixFileForZip64(Stream zipFs, int oldExtraFieldLength, int newExtraFieldLength) { long posNow = zipFs.Position; +#if NET20 || NET35 || NET40 + using (BinaryWriter bw = new(zipFs, Encoding.UTF8)) +#else using (BinaryWriter bw = new(zipFs, Encoding.UTF8, true)) +#endif { zipFs.Seek((long)RelativeOffsetOfLocalHeader + 4, SeekOrigin.Begin); ushort versionNeededToExtract = 45; diff --git a/SabreTools.FileTypes/Compress/gZip/gZip.cs b/SabreTools.FileTypes/Compress/gZip/gZip.cs index fb4ca434..2261adbd 100644 --- a/SabreTools.FileTypes/Compress/gZip/gZip.cs +++ b/SabreTools.FileTypes/Compress/gZip/gZip.cs @@ -90,7 +90,7 @@ namespace Compress.gZip ZipFileClose(); return ZipReturn.ZipErrorOpeningFile; } - catch(Exception) + catch (Exception) { ZipFileClose(); return ZipReturn.ZipErrorReadingFile; @@ -111,7 +111,11 @@ namespace Compress.gZip private ZipReturn ZipFileReadHeaders() { +#if NET20 || NET35 || NET40 + using BinaryReader zipBr = new(_zipFs, Encoding.UTF8); +#else using BinaryReader zipBr = new(_zipFs, Encoding.UTF8, true); +#endif byte ID1 = zipBr.ReadByte(); byte ID2 = zipBr.ReadByte(); @@ -316,7 +320,11 @@ namespace Compress.gZip public ZipReturn ZipFileOpenWriteStream(bool raw, bool trrntzip, string filename, ulong unCompressedSize, ushort compressionMethod, out Stream stream, TimeStamps dateTime) { +#if NET20 || NET35 || NET40 + using (BinaryWriter zipBw = new(_zipFs, Encoding.UTF8)) +#else using (BinaryWriter zipBw = new(_zipFs, Encoding.UTF8, true)) +#endif { UnCompressedSize = unCompressedSize; @@ -422,7 +430,11 @@ namespace Compress.gZip CompressedSize = (ulong)(_zipFs.Position - dataStartPos); +#if NET20 || NET35 || NET40 + using (BinaryWriter zipBw = new(_zipFs, Encoding.UTF8)) +#else using (BinaryWriter zipBw = new(_zipFs, Encoding.UTF8, true)) +#endif { zipBw.Write(crc32[3]); diff --git a/SabreTools.FileTypes/Folder.cs b/SabreTools.FileTypes/Folder.cs index 519d5dcb..bd7dc46f 100644 --- a/SabreTools.FileTypes/Folder.cs +++ b/SabreTools.FileTypes/Folder.cs @@ -171,7 +171,7 @@ namespace SabreTools.FileTypes public virtual string? CopyToFile(string entryName, string outDir) { string? realentry = null; - + // If we have an invalid filename if (this.Filename == null) return null; @@ -190,7 +190,7 @@ namespace SabreTools.FileTypes string? match = files.Where(s => s.EndsWith(entryName)).FirstOrDefault(); // If we had a file, copy that over to the new name - if (!string.IsNullOrWhiteSpace(match)) + if (!string.IsNullOrEmpty(match)) { realentry = match; File.Copy(match, Path.Combine(outDir, entryName)); @@ -232,9 +232,19 @@ namespace SabreTools.FileTypes string? match = files.Where(s => s.EndsWith(entryName)).FirstOrDefault(); // If we had a file, copy that over to the new name - if (!string.IsNullOrWhiteSpace(match)) + if (!string.IsNullOrEmpty(match)) { +#if NET20 || NET35 + var tempStream = File.OpenRead(match); + byte[] buffer = new byte[32768]; + int read; + while ((read = tempStream.Read(buffer, 0, buffer.Length)) > 0) + { + ms.Write(buffer, 0, read); + } +#else File.OpenRead(match).CopyTo(ms); +#endif realentry = match; } } @@ -264,14 +274,22 @@ namespace SabreTools.FileTypes if (_children == null || _children.Count == 0) { _children = []; +#if NETFRAMEWORK + foreach (string file in Directory.GetFiles(this.Filename, "*")) +#else foreach (string file in Directory.EnumerateFiles(this.Filename, "*", SearchOption.TopDirectoryOnly)) +#endif { BaseFile? nf = GetInfo(file, hashes: this.AvailableHashes); if (nf != null) _children.Add(nf); } +#if NETFRAMEWORK + foreach (string dir in Directory.GetDirectories(this.Filename, "*")) +#else foreach (string dir in Directory.EnumerateDirectories(this.Filename, "*", SearchOption.TopDirectoryOnly)) +#endif { Folder fl = new(dir); _children.Add(fl); @@ -337,7 +355,11 @@ namespace SabreTools.FileTypes if (writeToParent) fileName = Path.Combine(outDir, TextHelper.RemovePathUnsafeCharacters(baseFile.Filename) ?? string.Empty); else +#if NET20 || NET35 + fileName = Path.Combine(Path.Combine(outDir, TextHelper.RemovePathUnsafeCharacters(baseFile.Parent) ?? string.Empty), TextHelper.RemovePathUnsafeCharacters(baseFile.Filename) ?? string.Empty); +#else fileName = Path.Combine(outDir, TextHelper.RemovePathUnsafeCharacters(baseFile.Parent) ?? string.Empty, TextHelper.RemovePathUnsafeCharacters(baseFile.Filename) ?? string.Empty); +#endif try { @@ -365,7 +387,7 @@ namespace SabreTools.FileTypes outputStream.Dispose(); - if (!string.IsNullOrWhiteSpace(baseFile.Date)) + if (!string.IsNullOrEmpty(baseFile.Date)) File.SetCreationTime(fileName, DateTime.Parse(baseFile.Date)); success = true; diff --git a/SabreTools.FileTypes/RVIO/RVIO.cs b/SabreTools.FileTypes/RVIO/RVIO.cs index 8bf00ccb..4e2e6d9d 100644 --- a/SabreTools.FileTypes/RVIO/RVIO.cs +++ b/SabreTools.FileTypes/RVIO/RVIO.cs @@ -358,7 +358,11 @@ namespace RVIO catch (Exception e) { stream = null; +#if NET462_OR_GREATER || NETCOREAPP return e.HResult; +#else + return -1; +#endif } } @@ -372,7 +376,11 @@ namespace RVIO catch (Exception e) { stream = null; +#if NET462_OR_GREATER || NETCOREAPP return e.HResult; +#else + return -1; +#endif } } } diff --git a/SabreTools.FileTypes/SabreTools.FileTypes.csproj b/SabreTools.FileTypes/SabreTools.FileTypes.csproj index 4258bdcb..b747efa7 100644 --- a/SabreTools.FileTypes/SabreTools.FileTypes.csproj +++ b/SabreTools.FileTypes/SabreTools.FileTypes.csproj @@ -1,10 +1,23 @@  - net6.0;net8.0 + + net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 + win-x86;win-x64;win-arm64;linux-x64;linux-arm64;osx-x64 + false + false latest enable + true + 1.1.2 + + + Matt Nadareski + Copyright (c)2016-2024 Matt Nadareski + https://github.com/SabreTools/ + https://github.com/SabreTools/SabreTools + git @@ -14,11 +27,15 @@ - - + + + + + + diff --git a/SabreTools.Filtering/Cleaner.cs b/SabreTools.Filtering/Cleaner.cs index 886b78fe..8074d3fe 100644 --- a/SabreTools.Filtering/Cleaner.cs +++ b/SabreTools.Filtering/Cleaner.cs @@ -232,7 +232,13 @@ namespace SabreTools.Filtering // First we want to get a mapping for all games to description ConcurrentDictionary concurrentDictionary = new(); ConcurrentDictionary mapping = concurrentDictionary; +#if NET452_OR_GREATER || NETCOREAPP Parallel.ForEach(datFile.Items.Keys, Globals.ParallelOptions, key => +#elif NET40_OR_GREATER + Parallel.ForEach(datFile.Items.Keys, key => +#else + foreach (var key in datFile.Items.Keys) +#endif { var items = datFile.Items[key]; if (items == null) @@ -243,10 +249,20 @@ namespace SabreTools.Filtering // If the key mapping doesn't exist, add it mapping.TryAdd(item.Machine.Name!, item.Machine.Description!.Replace('/', '_').Replace("\"", "''").Replace(":", " -")); } +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif // Now we loop through every item and update accordingly +#if NET452_OR_GREATER || NETCOREAPP Parallel.ForEach(datFile.Items.Keys, Globals.ParallelOptions, key => +#elif NET40_OR_GREATER + Parallel.ForEach(datFile.Items.Keys, key => +#else + foreach (var key in datFile.Items.Keys) +#endif { var items = datFile.Items[key]; if (items == null) @@ -278,7 +294,11 @@ namespace SabreTools.Filtering // Replace the old list of roms with the new one datFile.Items.Remove(key); datFile.Items.AddRange(key, newItems); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } catch (Exception ex) when (!throwOnError) { @@ -379,7 +399,13 @@ namespace SabreTools.Filtering datFile.Header.Type = "SuperDAT"; // For each rom, we want to update the game to be "/" +#if NET452_OR_GREATER || NETCOREAPP Parallel.ForEach(datFile.Items.Keys, Globals.ParallelOptions, key => +#elif NET40_OR_GREATER + Parallel.ForEach(datFile.Items.Keys, key => +#else + foreach (var key in datFile.Items.Keys) +#endif { var items = datFile.Items[key]; if (items == null) @@ -389,7 +415,11 @@ namespace SabreTools.Filtering { SetOneRomPerGame(items[i]); } +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } /// @@ -419,7 +449,13 @@ namespace SabreTools.Filtering string pattern = @"([0-9]{2}\.[0-9]{2}\.[0-9]{2}-)(.*?-.*?)"; // Now process all of the roms +#if NET452_OR_GREATER || NETCOREAPP Parallel.ForEach(datFile.Items.Keys, Globals.ParallelOptions, key => +#elif NET40_OR_GREATER + Parallel.ForEach(datFile.Items.Keys, key => +#else + foreach (var key in datFile.Items.Keys) +#endif { var items = datFile.Items[key]; if (items == null) @@ -439,7 +475,11 @@ namespace SabreTools.Filtering datFile.Items.Remove(key); datFile.Items.AddRange(key, items); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } #endregion diff --git a/SabreTools.Filtering/Remover.cs b/SabreTools.Filtering/Remover.cs index c0224ef8..199f405d 100644 --- a/SabreTools.Filtering/Remover.cs +++ b/SabreTools.Filtering/Remover.cs @@ -68,7 +68,7 @@ namespace SabreTools.Filtering InternalStopwatch watch = new("Populating removals from list"); foreach (string field in fields) - { + { // If we don't even have a possible field name if (field == null) continue; @@ -111,7 +111,13 @@ namespace SabreTools.Filtering // Remove DatItem and Machine fields if (DatItemRemover != null && (DatItemRemover.MachineFields.Any() || DatItemRemover.DatItemFields.Any())) { +#if NET452_OR_GREATER || NETCOREAPP Parallel.ForEach(datFile.Items.Keys, Globals.ParallelOptions, key => +#elif NET40_OR_GREATER + Parallel.ForEach(datFile.Items.Keys, key => +#else + foreach (var key in datFile.Items.Keys) +#endif { ConcurrentList? items = datFile.Items[key]; if (items == null) @@ -124,7 +130,11 @@ namespace SabreTools.Filtering datFile.Items.Remove(key); datFile.Items.AddRange(key, items); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } watch.Stop(); diff --git a/SabreTools.Skippers/Rule.cs b/SabreTools.Skippers/Rule.cs index 8004f192..fdf65cb2 100644 --- a/SabreTools.Skippers/Rule.cs +++ b/SabreTools.Skippers/Rule.cs @@ -284,15 +284,23 @@ namespace SabreTools.Skippers } finally { -#if NET40_OR_GREATER // If we're not keeping the read stream open, dispose of the binary reader if (!keepReadOpen) + { +#if NET40_OR_GREATER br?.Dispose(); +#endif + } + // If we're not keeping the write stream open, dispose of the binary reader if (!keepWriteOpen) + { +#if NET40_OR_GREATER bw?.Dispose(); #endif + } + } return success; diff --git a/SabreTools/Features/Split.cs b/SabreTools/Features/Split.cs index fba832b9..34208c85 100644 --- a/SabreTools/Features/Split.cs +++ b/SabreTools/Features/Split.cs @@ -97,7 +97,11 @@ namespace SabreTools.Features Parallel.ForEach(typeDats.Keys, Globals.ParallelOptions, itemType => { Writer.Write(typeDats[itemType], OutputDir); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif watch.Stop(); } @@ -139,7 +143,11 @@ namespace SabreTools.Features Parallel.ForEach(sizedDats, Globals.ParallelOptions, sizedDat => { Writer.Write(sizedDat, OutputDir); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif watch.Stop(); } @@ -155,7 +163,11 @@ namespace SabreTools.Features Parallel.ForEach(typeDats.Keys, Globals.ParallelOptions, itemType => { Writer.Write(typeDats[itemType], OutputDir); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif watch.Stop(); } diff --git a/SabreTools/Features/Update.cs b/SabreTools/Features/Update.cs index 1edd9625..90fce663 100644 --- a/SabreTools/Features/Update.cs +++ b/SabreTools/Features/Update.cs @@ -175,7 +175,11 @@ namespace SabreTools.Features // Try to output the file, overwriting only if it's not in the current directory Writer.Write(datFile, realOutDir, overwrite: GetBoolean(features, InplaceValue)); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif return true; } @@ -308,7 +312,11 @@ namespace SabreTools.Features // Finally output the diffed DatFile string interOutDir = inputPath.GetOutputPath(OutputDir, GetBoolean(features, InplaceValue)); Writer.Write(repDat, interOutDir, overwrite: GetBoolean(features, InplaceValue)); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } // Output DATs after replacing fields from a base DatFile @@ -339,7 +347,11 @@ namespace SabreTools.Features // Finally output the replaced DatFile string interOutDir = inputPath.GetOutputPath(OutputDir, GetBoolean(features, InplaceValue)); Writer.Write(repDat, interOutDir, overwrite: GetBoolean(features, InplaceValue)); +#if NET40_OR_GREATER || NETCOREAPP }); +#else + } +#endif } // Merge all input files and write