diff --git a/SabreTools.DatFiles/Formats/SabreJSON.cs b/SabreTools.DatFiles/Formats/SabreJSON.cs index bb615438..2944fe85 100644 --- a/SabreTools.DatFiles/Formats/SabreJSON.cs +++ b/SabreTools.DatFiles/Formats/SabreJSON.cs @@ -29,7 +29,8 @@ namespace SabreTools.DatFiles.Formats public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false) { // Prepare all internal variables - var sr = new StreamReader(System.IO.File.OpenRead(filename), new UTF8Encoding(false)); + var fs = System.IO.File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + var sr = new StreamReader(fs, new UTF8Encoding(false)); var jtr = new JsonTextReader(sr); var source = new Source(indexId, filename); long sourceIndex = ItemsDB.AddSource(source); diff --git a/SabreTools.DatTools/Rebuilder.cs b/SabreTools.DatTools/Rebuilder.cs index 04e56beb..66a2b0af 100644 --- a/SabreTools.DatTools/Rebuilder.cs +++ b/SabreTools.DatTools/Rebuilder.cs @@ -787,7 +787,7 @@ namespace SabreTools.DatTools // Otherwise, just open the filestream else { - stream = System.IO.File.OpenRead(file); + stream = System.IO.File.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); } // If the stream is null, then continue diff --git a/SabreTools.FileTypes/Aaru/AaruFormat.cs b/SabreTools.FileTypes/Aaru/AaruFormat.cs index c4bda79c..df33909f 100644 --- a/SabreTools.FileTypes/Aaru/AaruFormat.cs +++ b/SabreTools.FileTypes/Aaru/AaruFormat.cs @@ -53,7 +53,7 @@ namespace SabreTools.FileTypes.Aaru /// Filename respresenting the AaruFormat file public static AaruFormat? Create(string filename) { - using FileStream fs = File.OpenRead(filename); + using Stream fs = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); return Create(fs); } diff --git a/SabreTools.FileTypes/Archives/GZipArchive.cs b/SabreTools.FileTypes/Archives/GZipArchive.cs index 6efc5baa..99b9814b 100644 --- a/SabreTools.FileTypes/Archives/GZipArchive.cs +++ b/SabreTools.FileTypes/Archives/GZipArchive.cs @@ -228,10 +228,11 @@ namespace SabreTools.FileTypes.Archives { gzipEntryRom.Filename = gamename; - using BinaryReader br = new(File.OpenRead(Filename)); - br.BaseStream.Seek(-8, SeekOrigin.End); - gzipEntryRom.CRC = br.ReadBytesBigEndian(4); - gzipEntryRom.Size = br.ReadInt32BigEndian(); + using Stream stream = File.Open(Filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + stream.Seek(-8, SeekOrigin.End); + gzipEntryRom.CRC = stream.ReadBytes(4); + Array.Reverse(gzipEntryRom.CRC); + gzipEntryRom.Size = stream.ReadInt32BigEndian(); } // Otherwise, use the stream directly else @@ -298,14 +299,12 @@ namespace SabreTools.FileTypes.Archives } // Get the Romba-specific header data - BinaryReader br = new(File.OpenRead(Filename)); - byte[] header = br.ReadBytes(12); // Get preamble header for checking - br.ReadBytes(16); // headermd5 - br.ReadBytes(4); // headercrc - br.ReadUInt64(); // headersz -#if NET40_OR_GREATER - br.Dispose(); -#endif + Stream stream = File.Open(Filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + byte[] header = stream.ReadBytes(12); // Get preamble header for checking + _ = stream.ReadBytes(16); // headermd5 + _ = stream.ReadBytes(4); // headercrc + _ = stream.ReadUInt64(); // headersz + stream.Dispose(); // If the header is not correct, return a blank rom bool correct = true; @@ -363,14 +362,12 @@ namespace SabreTools.FileTypes.Archives byte[] headermd5; // MD5 byte[] headercrc; // CRC ulong headersz; // Int64 size - BinaryReader br = new(File.OpenRead(Filename)); - header = br.ReadBytes(12); - headermd5 = br.ReadBytes(16); - headercrc = br.ReadBytes(4); - headersz = br.ReadUInt64(); -#if NET40_OR_GREATER - br.Dispose(); -#endif + Stream stream = File.Open(Filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + header = stream.ReadBytes(12); + headermd5 = stream.ReadBytes(16); + headercrc = stream.ReadBytes(4); + headersz = stream.ReadUInt64(); + stream.Dispose(); // If the header is not correct, return a blank rom bool correct = true; @@ -421,7 +418,8 @@ namespace SabreTools.FileTypes.Archives inputFile = Path.GetFullPath(inputFile); // Get the file stream for the file and write out - return Write(File.OpenRead(inputFile), outDir, baseFile); + using Stream inputStream = File.Open(inputFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + return Write(inputStream, outDir, baseFile); } /// diff --git a/SabreTools.FileTypes/Archives/RarArchive.cs b/SabreTools.FileTypes/Archives/RarArchive.cs index 3b22dba0..0dcae30c 100644 --- a/SabreTools.FileTypes/Archives/RarArchive.cs +++ b/SabreTools.FileTypes/Archives/RarArchive.cs @@ -194,7 +194,7 @@ namespace SabreTools.FileTypes.Archives try { - SharpCompress.Archives.Rar.RarArchive ra = SharpCompress.Archives.Rar.RarArchive.Open(File.OpenRead(Filename)); + SharpCompress.Archives.Rar.RarArchive ra = SharpCompress.Archives.Rar.RarArchive.Open(File.Open(Filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); foreach (RarArchiveEntry entry in ra.Entries.Where(e => e != null && !e.IsDirectory)) { // Create a blank item for the entry @@ -294,8 +294,18 @@ namespace SabreTools.FileTypes.Archives /// public override bool Write(string inputFile, string outDir, BaseFile? baseFile) { + // Check that the input file exists + if (!File.Exists(inputFile)) + { + _logger.Warning($"File '{inputFile}' does not exist!"); + return false; + } + + inputFile = Path.GetFullPath(inputFile); + // Get the file stream for the file and write out - return Write(File.OpenRead(inputFile), outDir, baseFile); + using Stream inputStream = File.Open(inputFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + return Write(inputStream, outDir, baseFile); } /// diff --git a/SabreTools.FileTypes/Archives/SevenZipArchive.cs b/SabreTools.FileTypes/Archives/SevenZipArchive.cs index 6007f126..08c5c3af 100644 --- a/SabreTools.FileTypes/Archives/SevenZipArchive.cs +++ b/SabreTools.FileTypes/Archives/SevenZipArchive.cs @@ -378,8 +378,18 @@ namespace SabreTools.FileTypes.Archives /// public override bool Write(string inputFile, string outDir, BaseFile? baseFile) { + // Check that the input file exists + if (!File.Exists(inputFile)) + { + _logger.Warning($"File '{inputFile}' does not exist!"); + return false; + } + + inputFile = Path.GetFullPath(inputFile); + // Get the file stream for the file and write out - return Write(File.OpenRead(inputFile), outDir, baseFile); + using Stream inputStream = File.Open(inputFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + return Write(inputStream, outDir, baseFile); } /// @@ -638,7 +648,7 @@ namespace SabreTools.FileTypes.Archives int index = inputIndexMap[key]; // Open the input file for reading - Stream freadStream = File.OpenRead(inputFiles[index]); + Stream freadStream = File.Open(inputFiles[index], FileMode.Open, FileAccess.Read, FileShare.ReadWrite); ulong istreamSize = (ulong)new FileInfo(inputFiles[index]).Length; DateTime dt = DateTime.Now; @@ -720,7 +730,7 @@ namespace SabreTools.FileTypes.Archives if (index < 0) { // Open the input file for reading - Stream freadStream = File.OpenRead(inputFiles[-index - 1]); + Stream freadStream = File.Open(inputFiles[-index - 1], FileMode.Open, FileAccess.Read, FileShare.ReadWrite); ulong istreamSize = (ulong)(new FileInfo(inputFiles[-index - 1]).Length); DateTime dt = DateTime.Now; diff --git a/SabreTools.FileTypes/Archives/TapeArchive.cs b/SabreTools.FileTypes/Archives/TapeArchive.cs index 5873c53b..6fc69583 100644 --- a/SabreTools.FileTypes/Archives/TapeArchive.cs +++ b/SabreTools.FileTypes/Archives/TapeArchive.cs @@ -187,7 +187,7 @@ namespace SabreTools.FileTypes.Archives try { - TarArchive ta = TarArchive.Open(File.OpenRead(Filename!)); + TarArchive ta = TarArchive.Open(File.Open(Filename!, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); foreach (TarArchiveEntry entry in ta.Entries.Where(e => e != null && !e.IsDirectory)) { // Create a blank item for the entry @@ -283,8 +283,18 @@ namespace SabreTools.FileTypes.Archives /// public override bool Write(string inputFile, string outDir, BaseFile? baseFile) { + // Check that the input file exists + if (!File.Exists(inputFile)) + { + _logger.Warning($"File '{inputFile}' does not exist!"); + return false; + } + + inputFile = Path.GetFullPath(inputFile); + // Get the file stream for the file and write out - return Write(File.OpenRead(inputFile), outDir, baseFile); + using Stream inputStream = File.Open(inputFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + return Write(inputStream, outDir, baseFile); } /// @@ -492,7 +502,10 @@ namespace SabreTools.FileTypes.Archives usableDate = dt; // Copy the input stream to the output - tarFile.AddEntry(baseFiles[index].Filename!, File.OpenRead(inputFiles[index]), size: baseFiles[index].Size ?? 0, modified: usableDate); + tarFile.AddEntry(baseFiles[index].Filename!, + File.Open(inputFiles[index], FileMode.Open, FileAccess.Read, FileShare.ReadWrite), + size: baseFiles[index].Size ?? 0, + modified: usableDate); } } @@ -554,7 +567,10 @@ namespace SabreTools.FileTypes.Archives usableDate = dt; // Copy the input file to the output - tarFile.AddEntry(baseFiles[-index - 1].Filename!, File.OpenRead(inputFiles[-index - 1]), size: baseFiles[-index - 1].Size ?? 0, modified: usableDate); + tarFile.AddEntry(baseFiles[-index - 1].Filename!, + File.Open(inputFiles[-index - 1], FileMode.Open, FileAccess.Read, FileShare.ReadWrite), + size: baseFiles[-index - 1].Size ?? 0, + modified: usableDate); } // Otherwise, copy the file from the old archive diff --git a/SabreTools.FileTypes/Archives/XZArchive.cs b/SabreTools.FileTypes/Archives/XZArchive.cs index 984169d4..7ff7e0c9 100644 --- a/SabreTools.FileTypes/Archives/XZArchive.cs +++ b/SabreTools.FileTypes/Archives/XZArchive.cs @@ -70,7 +70,7 @@ namespace SabreTools.FileTypes.Archives // Decompress the _filename stream FileStream outstream = File.Create(Path.Combine(outDir, Path.GetFileNameWithoutExtension(Filename)!)); - var xz = new XZStream(File.OpenRead(Filename!)); + var xz = new XZStream(File.Open(Filename!, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); xz.CopyTo(outstream); // Dispose of the streams @@ -156,7 +156,7 @@ namespace SabreTools.FileTypes.Archives { // Open the entry stream string realEntry = Path.GetFileNameWithoutExtension(Filename); - var stream = new XZStream(File.OpenRead(Filename)); + var stream = new XZStream(File.Open(Filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); // Return the stream return (stream, realEntry); @@ -206,15 +206,16 @@ namespace SabreTools.FileTypes.Archives { xzEntryRom.Filename = gamename; - using BinaryReader br = new(File.OpenRead(Filename!)); - br.BaseStream.Seek(-8, SeekOrigin.End); - xzEntryRom.CRC = br.ReadBytesBigEndian(4); - xzEntryRom.Size = br.ReadInt32BigEndian(); + using Stream fs = File.Open(Filename!, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + fs.Seek(-8, SeekOrigin.End); + xzEntryRom.CRC = fs.ReadBytes(4); + Array.Reverse(xzEntryRom.CRC); + xzEntryRom.Size = fs.ReadInt32BigEndian(); } // Otherwise, use the stream directly else { - var xzStream = new XZStream(File.OpenRead(Filename!)); + var xzStream = new XZStream(File.Open(Filename!, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); xzEntryRom = FileTypeTool.GetInfo(xzStream, _hashTypes); xzEntryRom.Filename = gamename; xzStream.Dispose(); @@ -310,7 +311,8 @@ namespace SabreTools.FileTypes.Archives inputFile = Path.GetFullPath(inputFile); // Get the file stream for the file and write out - return Write(File.OpenRead(inputFile), outDir, baseFile); + using Stream inputStream = File.Open(inputFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + return Write(inputStream, outDir, baseFile); } /// diff --git a/SabreTools.FileTypes/Archives/ZipArchive.cs b/SabreTools.FileTypes/Archives/ZipArchive.cs index bb0c37e5..3450e3c7 100644 --- a/SabreTools.FileTypes/Archives/ZipArchive.cs +++ b/SabreTools.FileTypes/Archives/ZipArchive.cs @@ -556,8 +556,18 @@ namespace SabreTools.FileTypes.Archives /// public override bool Write(string inputFile, string outDir, BaseFile? baseFile) { + // Check that the input file exists + if (!File.Exists(inputFile)) + { + _logger.Warning($"File '{inputFile}' does not exist!"); + return false; + } + + inputFile = Path.GetFullPath(inputFile); + // Get the file stream for the file and write out - return Write(File.OpenRead(inputFile), outDir, baseFile); + using Stream inputStream = File.Open(inputFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + return Write(inputStream, outDir, baseFile); } /// @@ -809,7 +819,7 @@ namespace SabreTools.FileTypes.Archives int index = inputIndexMap[key]; // Open the input file for reading - Stream freadStream = File.OpenRead(inputFiles[index]); + Stream freadStream = File.Open(inputFiles[index], FileMode.Open, FileAccess.Read, FileShare.ReadWrite); ulong istreamSize = (ulong)(new FileInfo(inputFiles[index]).Length); DateTime dt = DateTime.Now; @@ -891,7 +901,7 @@ namespace SabreTools.FileTypes.Archives if (index < 0) { // Open the input file for reading - Stream freadStream = File.OpenRead(inputFiles[-index - 1]); + Stream freadStream = File.Open(inputFiles[-index - 1], FileMode.Open, FileAccess.Read, FileShare.ReadWrite); ulong istreamSize = (ulong)(new FileInfo(inputFiles[-index - 1]).Length); DateTime dt = DateTime.Now; diff --git a/SabreTools.FileTypes/CHD/CHDFile.cs b/SabreTools.FileTypes/CHD/CHDFile.cs index c7634673..7ac17ce9 100644 --- a/SabreTools.FileTypes/CHD/CHDFile.cs +++ b/SabreTools.FileTypes/CHD/CHDFile.cs @@ -22,7 +22,7 @@ namespace SabreTools.FileTypes.CHD /// Filename respresenting the CHD file public static CHDFile? Create(string filename) { - using var fs = File.OpenRead(filename); + using Stream fs = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); return Create(fs); } diff --git a/SabreTools.FileTypes/FileTypeTool.cs b/SabreTools.FileTypes/FileTypeTool.cs index 8195f44b..4359ae39 100644 --- a/SabreTools.FileTypes/FileTypeTool.cs +++ b/SabreTools.FileTypes/FileTypeTool.cs @@ -123,7 +123,7 @@ namespace SabreTools.FileTypes /// Hashes to include in the information /// Indicates if the underlying read stream should be kept open /// Populated BaseFile object if success, empty one on error - public static BaseFile GetInfo(Stream? input, long size, HashType[]? hashes, bool keepReadOpen) + public static BaseFile GetInfo(Stream? input, long size, HashType[] hashes, bool keepReadOpen) { // If we have no stream if (input == null) diff --git a/SabreTools.FileTypes/Folder.cs b/SabreTools.FileTypes/Folder.cs index bc016941..be7d6554 100644 --- a/SabreTools.FileTypes/Folder.cs +++ b/SabreTools.FileTypes/Folder.cs @@ -189,7 +189,7 @@ namespace SabreTools.FileTypes // If we had a file, open and return the stream if (!string.IsNullOrEmpty(match)) { - var stream = File.OpenRead(match); + Stream stream = File.Open(match, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); return (stream, match); } @@ -266,8 +266,8 @@ namespace SabreTools.FileTypes /// public bool Write(string inputFile, string outDir, BaseFile? baseFile) { - FileStream fs = File.OpenRead(inputFile); - return Write(fs, outDir, baseFile); + using Stream inputStream = File.Open(inputFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + return Write(inputStream, outDir, baseFile); } ///