Merge pull request #694 from erri120/issue-693

Extraction Fixes
This commit is contained in:
Timothy Baldridge 2020-04-09 14:24:08 -06:00 committed by GitHub
commit ea1d275a16
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 34 deletions

View File

@ -20,7 +20,7 @@ namespace Wabbajack.Common
public static string MegaPrefix = "https://mega.nz/#!";
public static HashSet<string> SupportedArchives = new HashSet<string>(StringComparer.OrdinalIgnoreCase) {".zip", ".rar", ".7z", ".7zip", ".fomod", ".omod", ".exe", ".dat"};
public static HashSet<string> SupportedArchives = new HashSet<string>(StringComparer.OrdinalIgnoreCase) {".zip", ".rar", ".7z", ".7zip", ".fomod", ".omod", ".exe", ".dat", ".gz", ".tar"};
// HashSet with archive extensions that need to be tested before extraction
public static HashSet<string> TestArchivesBeforeExtraction = new HashSet<string>(StringComparer.OrdinalIgnoreCase) {".dat"};

View File

@ -25,7 +25,7 @@ namespace Wabbajack.VirtualFileSystem
else if (source.EndsWith(".omod"))
ExtractAllWithOMOD(source, dest);
else if (source.EndsWith(".exe"))
ExtractAllWithInno(source, dest);
ExtractAllEXE(source, dest);
else
ExtractAllWith7Zip(source, dest);
}
@ -35,8 +35,16 @@ namespace Wabbajack.VirtualFileSystem
}
}
private static void ExtractAllWithInno(string source, string dest)
private static void ExtractAllEXE(string source, string dest)
{
var isArchive = TestWith7z(source);
if (isArchive)
{
ExtractAllWith7Zip(source, dest);
return;
}
Utils.Log($"Extracting {Path.GetFileName(source)}");
var info = new ProcessStartInfo
@ -225,46 +233,50 @@ namespace Wabbajack.VirtualFileSystem
if(ext != ".exe" && !Consts.TestArchivesBeforeExtraction.Contains(ext))
return Consts.SupportedArchives.Contains(ext) || Consts.SupportedBSAs.Contains(ext);
if (ext == ".exe")
var isArchive = TestWith7z(v);
if (isArchive)
return true;
var info = new ProcessStartInfo
{
var info = new ProcessStartInfo
{
FileName = @"Extractors\innounp.exe",
Arguments = $"-t \"{v}\" ",
RedirectStandardError = true,
RedirectStandardInput = true,
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
FileName = @"Extractors\innounp.exe",
Arguments = $"-t \"{v}\" ",
RedirectStandardError = true,
RedirectStandardInput = true,
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
var p = new Process {StartInfo = info};
var p = new Process {StartInfo = info};
p.Start();
ChildProcessTracker.AddProcess(p);
p.Start();
ChildProcessTracker.AddProcess(p);
var name = Path.GetFileName(v);
while (!p.HasExited)
{
var line = p.StandardOutput.ReadLine();
if (line == null)
break;
var name = Path.GetFileName(v);
while (!p.HasExited)
{
var line = p.StandardOutput.ReadLine();
if (line == null)
break;
if (line[0] != '#')
continue;
if (line[0] != '#')
continue;
Utils.Status($"Testing {name} - {line.Trim()}");
}
p.WaitForExitAndWarn(TimeSpan.FromSeconds(30), $"Testing {name}");
return p.ExitCode == 0;
Utils.Status($"Testing {name} - {line.Trim()}");
}
p.WaitForExitAndWarn(TimeSpan.FromSeconds(30), $"Testing {name}");
return p.ExitCode == 0;
}
public static bool TestWith7z(string file)
{
var testInfo = new ProcessStartInfo
{
FileName = @"Extractors\7z.exe",
Arguments = $"t \"{v}\"",
Arguments = $"t \"{file}\"",
RedirectStandardError = true,
RedirectStandardInput = true,
RedirectStandardOutput = true,
@ -282,6 +294,7 @@ namespace Wabbajack.VirtualFileSystem
}
catch (Exception)
{
return false;
}
try
@ -292,13 +305,16 @@ namespace Wabbajack.VirtualFileSystem
if (line == null)
break;
}
} catch (Exception){}
}
catch (Exception)
{
return false;
}
testP.WaitForExitAndWarn(TimeSpan.FromSeconds(30), $"Can Extract Check {v}");
testP.WaitForExitAndWarn(TimeSpan.FromSeconds(30), $"Can Extract Check {file}");
return testP.ExitCode == 0;
}
public static bool MightBeArchive(string path)
{
var ext = Path.GetExtension(path.ToLower());