diff --git a/SabreTools.Helper/Objects/SimpleSort.cs b/SabreTools.Helper/Objects/SimpleSort.cs index 8164121e..d0aef76b 100644 --- a/SabreTools.Helper/Objects/SimpleSort.cs +++ b/SabreTools.Helper/Objects/SimpleSort.cs @@ -406,7 +406,6 @@ namespace SabreTools.Helper #endregion - // HERE BE DRAGONS #region Find all files to rebuild and bucket by game // Create a dictionary of from/to Rom mappings diff --git a/SabreTools.Helper/Objects/ZipFIle.cs b/SabreTools.Helper/Objects/ZipFIle.cs index 39d0764b..aca6cfb7 100644 --- a/SabreTools.Helper/Objects/ZipFIle.cs +++ b/SabreTools.Helper/Objects/ZipFIle.cs @@ -629,7 +629,7 @@ namespace SabreTools.Helper _zipFileInfo = new FileInfo(filename); // Now try to open the file - _zipstream = File.OpenWrite(filename); + _zipstream = File.Open(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite); ZipOpen = ZipOpenType.OpenWrite; return ZipReturn.ZipGood; } diff --git a/SabreTools.Helper/Skippers/Skippers.cs b/SabreTools.Helper/Skippers/Skippers.cs index 70e19407..7c482b78 100644 --- a/SabreTools.Helper/Skippers/Skippers.cs +++ b/SabreTools.Helper/Skippers/Skippers.cs @@ -350,7 +350,7 @@ namespace SabreTools.Helper foreach (SkipperRule rule in skipper.Rules) { // Always reset the stream back to the original place - br.BaseStream.Seek(0, SeekOrigin.Begin); + input.Seek(0, SeekOrigin.Begin); // For each rule, make sure it passes each test bool success = true; @@ -363,15 +363,15 @@ namespace SabreTools.Helper // First seek to the correct position if (test.Offset == null) { - br.BaseStream.Seek(0, SeekOrigin.End); + input.Seek(0, SeekOrigin.End); } - else if (test.Offset > 0 && test.Offset <= br.BaseStream.Length) + else if (test.Offset > 0 && test.Offset <= input.Length) { - br.BaseStream.Seek((long)test.Offset, SeekOrigin.Begin); + input.Seek((long)test.Offset, SeekOrigin.Begin); } - else if (test.Offset < 0 && Math.Abs((long)test.Offset) <= br.BaseStream.Length) + else if (test.Offset < 0 && Math.Abs((long)test.Offset) <= input.Length) { - br.BaseStream.Seek((long)test.Offset, SeekOrigin.End); + input.Seek((long)test.Offset, SeekOrigin.End); } // Then read and compare bytewise @@ -402,15 +402,15 @@ namespace SabreTools.Helper // First seek to the correct position if (test.Offset == null) { - br.BaseStream.Seek(0, SeekOrigin.End); + input.Seek(0, SeekOrigin.End); } - else if (test.Offset > 0 && test.Offset <= br.BaseStream.Length) + else if (test.Offset > 0 && test.Offset <= input.Length) { - br.BaseStream.Seek((long)test.Offset, SeekOrigin.Begin); + input.Seek((long)test.Offset, SeekOrigin.Begin); } - else if (test.Offset < 0 && Math.Abs((long)test.Offset) <= br.BaseStream.Length) + else if (test.Offset < 0 && Math.Abs((long)test.Offset) <= input.Length) { - br.BaseStream.Seek((long)test.Offset, SeekOrigin.End); + input.Seek((long)test.Offset, SeekOrigin.End); } result = true; @@ -446,7 +446,7 @@ namespace SabreTools.Helper break; case HeaderSkipTest.File: // First get the file size from stream - long size = br.BaseStream.Length; + long size = input.Length; // If we have a null size, check that the size is a power of 2 result = true; @@ -474,16 +474,16 @@ namespace SabreTools.Helper } } - // If we're not keeping the stream open, dispose of the binary reader - if (!keepOpen) - { - br.Close(); - br.Dispose(); - } - // If we still have a success, then return this rule if (success) { + // If we're not keeping the stream open, dispose of the binary reader + if (!keepOpen) + { + input.Close(); + input.Dispose(); + } + logger.User(" Matching rule found!"); return rule; } @@ -491,6 +491,13 @@ namespace SabreTools.Helper } } + // If we're not keeping the stream open, dispose of the binary reader + if (!keepOpen) + { + input.Close(); + input.Dispose(); + } + // If we have a blank rule, inform the user if (skipperRule.Tests == null) { @@ -526,7 +533,7 @@ namespace SabreTools.Helper } logger.User("Attempting to apply rule to '" + input + "'"); - success = TransformStream(File.OpenRead(input), File.OpenWrite(output), rule, logger); + success = TransformStream(File.Open(input, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), File.OpenWrite(output), rule, logger); // If the output file has size 0, delete it if (new FileInfo(output).Length == 0) @@ -534,6 +541,7 @@ namespace SabreTools.Helper try { File.Delete(output); + success = false; } catch { @@ -582,17 +590,17 @@ namespace SabreTools.Helper { success = false; } - else if (Math.Abs((long)rule.StartOffset) > br.BaseStream.Length) + else if (Math.Abs((long)rule.StartOffset) > input.Length) { success = false; } else if (rule.StartOffset > 0) { - br.BaseStream.Seek((long)rule.StartOffset, SeekOrigin.Begin); + input.Seek((long)rule.StartOffset, SeekOrigin.Begin); } else if (rule.StartOffset < 0) { - br.BaseStream.Seek((long)rule.StartOffset, SeekOrigin.End); + input.Seek((long)rule.StartOffset, SeekOrigin.End); } // Then read and apply the operation as you go @@ -600,8 +608,8 @@ namespace SabreTools.Helper { byte[] buffer = new byte[4]; int pos = 0; - while (br.BaseStream.Position < (rule.EndOffset != null ? rule.EndOffset : br.BaseStream.Length) - && br.BaseStream.Position < br.BaseStream.Length) + while (input.Position < (rule.EndOffset != null ? rule.EndOffset : input.Length) + && input.Position < input.Length) { byte b = br.ReadByte(); switch (rule.Operation) diff --git a/SabreTools.Helper/Tools/FileTools.cs b/SabreTools.Helper/Tools/FileTools.cs index 2740cec2..c669aca5 100644 --- a/SabreTools.Helper/Tools/FileTools.cs +++ b/SabreTools.Helper/Tools/FileTools.cs @@ -211,7 +211,7 @@ namespace SabreTools.Helper Rom rom = roms[inputIndexMap[key]]; // Open the input file for reading - using (Stream readStream = File.OpenRead(inputFile)) + using (Stream readStream = File.Open(inputFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { ulong streamSize = (ulong)(new FileInfo(inputFile).Length); zipReturn = zipFile.OpenWriteStream(false, true, rom.Name, streamSize, CompressionMethod.Deflated, out writeStream); @@ -278,7 +278,7 @@ namespace SabreTools.Helper if (index < 0) { // Open the input file for reading - Stream freadStream = File.OpenRead(key); + Stream freadStream = File.Open(key, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); ulong istreamSize = (ulong)(new FileInfo(key).Length); zipFile.OpenWriteStream(false, true, roms[-index - 1].Name, istreamSize, CompressionMethod.Deflated, out writeStream); @@ -710,8 +710,9 @@ namespace SabreTools.Helper /// True if MD5 hashes should not be calculated, false otherwise (default) /// True if SHA-1 hashes should not be calcluated, false otherwise (default) /// Set a >0 number for getting hash for part of the file, 0 otherwise (default) + /// True if the underlying read stream should be kept open, false otherwise /// Populated RomData object if success, empty one on error - public static Rom GetSingleStreamInfo(Stream input, bool noMD5 = false, bool noSHA1 = false, long offset = 0) + public static Rom GetSingleStreamInfo(Stream input, bool noMD5 = false, bool noSHA1 = false, long offset = 0, bool keepReadOpen = false) { // If we have a negative offset, zero it out since we don't support it yet if (offset < 0) @@ -777,6 +778,14 @@ namespace SabreTools.Helper { return new Rom(); } + finally + { + if (!keepReadOpen) + { + input.Close(); + input.Dispose(); + } + } return rom; }