diff --git a/SabreTools.Helper/Tools/ArchiveTools.cs b/SabreTools.Helper/Tools/ArchiveTools.cs index 9df9e5b7..796f8c83 100644 --- a/SabreTools.Helper/Tools/ArchiveTools.cs +++ b/SabreTools.Helper/Tools/ArchiveTools.cs @@ -222,61 +222,17 @@ namespace SabreTools.Helper.Tools public static string ExtractItem(string input, string entryName, string tempDir, Logger logger) { string realEntry = ""; - Stream ms = ExtractStream(input, entryName, out realEntry, logger); - // If we got out a null or empty entry, then we don't have a stream - if (String.IsNullOrEmpty(realEntry) || ms == null) - { - ms?.Dispose(); - return null; - } - - realEntry = Path.Combine(Path.GetFullPath(tempDir), realEntry); - if (!Directory.Exists(Path.GetDirectoryName(realEntry))) - { - Directory.CreateDirectory(Path.GetDirectoryName(realEntry)); - } - - FileStream fs = File.Open(realEntry, FileMode.Create, FileAccess.Write); - - byte[] ibuffer = new byte[_bufferSize]; - int ilen; - while ((ilen = ms.Read(ibuffer, 0, _bufferSize)) > 0) - { - - fs.Write(ibuffer, 0, ilen); - fs.Flush(); - } - - // Dispose of the streams - ms.Dispose(); - fs.Dispose(); - - return realEntry; - } - - /// - /// Attempt to extract a stream from an archive - /// - /// Name of the archive to be extracted - /// Name of the entry to be extracted - /// Logger object for file and console output - /// Name of the extracted file, null on error - public static Stream ExtractStream(string input, string entryName, out string realEntry, Logger logger) - { // Set the real entry name realEntry = ""; - // Get a writable stream to return - Stream st = new MemoryStream(); - // First get the archive type ArchiveType? at = GetCurrentArchiveType(input, logger); // If we got back null, then it's not an archive, so we we return if (at == null) { - return st; + return realEntry; } try @@ -291,7 +247,16 @@ namespace SabreTools.Helper.Tools if (entry != null && !entry.IsDirectory && entry.Key.Contains(entryName)) { realEntry = entry.Key; - entry.WriteTo(st); + + // Get the output path + realEntry = Path.Combine(Path.GetFullPath(tempDir), realEntry); + if (!Directory.Exists(Path.GetDirectoryName(realEntry))) + { + Directory.CreateDirectory(Path.GetDirectoryName(realEntry)); + } + + // Write the file out + entry.WriteToFile(realEntry); break; } } @@ -302,10 +267,28 @@ namespace SabreTools.Helper.Tools // Decompress the input stream realEntry = Path.GetFileNameWithoutExtension(input); GZipStream gzstream = new GZipStream(File.OpenRead(input), CompressionMode.Decompress); - gzstream.CopyTo(st); - // Dispose of the stream + // Get the output path + realEntry = Path.Combine(Path.GetFullPath(tempDir), realEntry); + if (!Directory.Exists(Path.GetDirectoryName(realEntry))) + { + Directory.CreateDirectory(Path.GetDirectoryName(realEntry)); + } + + // Write the file out + FileStream gzfileout = File.Open(realEntry, FileMode.Create, FileAccess.Write); + byte[] gbuffer = new byte[_bufferSize]; + int glen; + while ((glen = gzstream.Read(gbuffer, 0, _bufferSize)) > 0) + { + + gzfileout.Write(gbuffer, 0, glen); + gzfileout.Flush(); + } + + // Dispose of the streams gzstream.Dispose(); + gzfileout.Dispose(); break; case ArchiveType.Rar: @@ -316,7 +299,16 @@ namespace SabreTools.Helper.Tools if (entry != null && !entry.IsDirectory && entry.Key.Contains(entryName)) { realEntry = entry.Key; - entry.WriteTo(st); + + // Get the output path + realEntry = Path.Combine(Path.GetFullPath(tempDir), realEntry); + if (!Directory.Exists(Path.GetDirectoryName(realEntry))) + { + Directory.CreateDirectory(Path.GetDirectoryName(realEntry)); + } + + // Write the file out + entry.WriteToFile(realEntry); break; } } @@ -331,7 +323,16 @@ namespace SabreTools.Helper.Tools if (entry != null && !entry.IsDirectory && entry.Key.Contains(entryName)) { realEntry = entry.Key; - entry.WriteTo(st); + + // Get the output path + realEntry = Path.Combine(Path.GetFullPath(tempDir), realEntry); + if (!Directory.Exists(Path.GetDirectoryName(realEntry))) + { + Directory.CreateDirectory(Path.GetDirectoryName(realEntry)); + } + + // Write the file out + entry.WriteToFile(realEntry); break; } } @@ -361,15 +362,25 @@ namespace SabreTools.Helper.Tools zr = zf.OpenReadStream(i, false, out readStream, out streamsize, out cm, out lastMod); - byte[] ibuffer = new byte[_bufferSize]; - int ilen; - while ((ilen = readStream.Read(ibuffer, 0, _bufferSize)) > 0) + // Get the output path + realEntry = Path.Combine(Path.GetFullPath(tempDir), realEntry); + if (!Directory.Exists(Path.GetDirectoryName(realEntry))) { - st.Write(ibuffer, 0, ilen); - st.Flush(); + Directory.CreateDirectory(Path.GetDirectoryName(realEntry)); + } + + // Write the file out + FileStream zipfileout = File.Open(realEntry, FileMode.Create, FileAccess.Write); + byte[] zbuffer = new byte[_bufferSize]; + int zlen; + while ((zlen = readStream.Read(zbuffer, 0, _bufferSize)) > 0) + { + zipfileout.Write(zbuffer, 0, zlen); + zipfileout.Flush(); } zr = zf.CloseReadStream(); + zipfileout.Dispose(); } } break; @@ -378,16 +389,10 @@ namespace SabreTools.Helper.Tools catch (Exception ex) { logger.Error(ex.ToString()); - st = null; + realEntry = ""; } - // If we have a non-null stream, we seek to the beginning - if (st != null) - { - st.Position = 0; - } - - return st; + return realEntry; } #endregion