diff --git a/SabreTools.Helper/Tools/DatTools.cs b/SabreTools.Helper/Tools/DatTools.cs index 9a56dc70..d2ebacd8 100644 --- a/SabreTools.Helper/Tools/DatTools.cs +++ b/SabreTools.Helper/Tools/DatTools.cs @@ -1990,8 +1990,10 @@ namespace SabreTools.Helper /// Retrieve file information for a single file /// /// Filename to get information from + /// True if MD5 hashes should not be calculated, false otherwise + /// True if SHA-1 hashes should not be calcluated, false otherwise /// Populated RomData object if success, empty one on error - public static RomData GetSingleFileInfo(string input) + public static RomData GetSingleFileInfo(string input, bool noMD5 = false, bool noSHA1 = false) { RomData rom = new RomData { @@ -2005,24 +2007,39 @@ namespace SabreTools.Helper try { - Crc32 crc = new Crc32(); - MD5 md5 = MD5.Create(); - SHA1 sha1 = SHA1.Create(); - - using (FileStream fs = File.Open(input, FileMode.Open)) + using (Crc32 crc = new Crc32()) + using (MD5 md5 = MD5.Create()) + using (SHA1 sha1 = SHA1.Create()) + using (FileStream fs = File.OpenRead(input)) { - foreach (byte b in crc.ComputeHash(fs)) + byte[] buffer = new byte[1024]; + int read; + while ((read = fs.Read(buffer, 0, buffer.Length)) > 0) { - rom.CRC += b.ToString("x2").ToLowerInvariant(); + crc.TransformBlock(buffer, 0, read, buffer, 0); + if (!noMD5) + { + md5.TransformBlock(buffer, 0, read, buffer, 0); + } + if (!noSHA1) + { + sha1.TransformBlock(buffer, 0, read, buffer, 0); + } + } + + crc.TransformFinalBlock(buffer, 0, 0); + rom.CRC = BitConverter.ToString(crc.Hash).Replace("-", "").ToLowerInvariant(); + + if (!noMD5) + { + md5.TransformFinalBlock(buffer, 0, 0); + rom.MD5 = BitConverter.ToString(md5.Hash).Replace("-", "").ToLowerInvariant(); + } + if (!noSHA1) + { + sha1.TransformFinalBlock(buffer, 0, 0); + rom.SHA1 = BitConverter.ToString(sha1.Hash).Replace("-", "").ToLowerInvariant(); } - } - using (FileStream fs = File.Open(input, FileMode.Open)) - { - rom.MD5 = BitConverter.ToString(md5.ComputeHash(fs)).Replace("-", "").ToLowerInvariant(); - } - using (FileStream fs = File.Open(input, FileMode.Open)) - { - rom.SHA1 = BitConverter.ToString(sha1.ComputeHash(fs)).Replace("-", "").ToLowerInvariant(); } } catch (IOException) diff --git a/SabreTools/DATFromDir.cs b/SabreTools/DATFromDir.cs index 8932cd43..328081db 100644 --- a/SabreTools/DATFromDir.cs +++ b/SabreTools/DATFromDir.cs @@ -371,7 +371,7 @@ namespace SabreTools private string ProcessFile(string item, StreamWriter sw, string basepath, string parent, DatData datdata, string lastparent) { _logger.Log(Path.GetFileName(item) + " treated like a file"); - RomData rom = DatTools.GetSingleFileInfo(item); + RomData rom = DatTools.GetSingleFileInfo(item, _noMD5, _noSHA1); try {