bunch of fixes to file extraction

This commit is contained in:
Timothy Baldridge 2019-08-29 16:49:48 -06:00
parent 5ddbd832f6
commit b72a64ff8b
4 changed files with 82 additions and 23 deletions

View File

@ -7,8 +7,11 @@ using System.Collections.Immutable;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Security.AccessControl;
using Alphaleonis.Win32.Filesystem;
using Wabbajack.Common; using Wabbajack.Common;
using Directory = Alphaleonis.Win32.Filesystem.Directory; using Directory = Alphaleonis.Win32.Filesystem.Directory;
using DirectoryInfo = Alphaleonis.Win32.Filesystem.DirectoryInfo;
using File = Alphaleonis.Win32.Filesystem.File; using File = Alphaleonis.Win32.Filesystem.File;
using FileInfo = Alphaleonis.Win32.Filesystem.FileInfo; using FileInfo = Alphaleonis.Win32.Filesystem.FileInfo;
using Path = Alphaleonis.Win32.Filesystem.Path; using Path = Alphaleonis.Win32.Filesystem.Path;
@ -32,33 +35,49 @@ namespace VFS
VFS = new VirtualFileSystem(); VFS = new VirtualFileSystem();
RootFolder = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); RootFolder = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
_stagedRoot = Path.Combine(RootFolder, "vfs_staged_files"); _stagedRoot = Path.Combine(RootFolder, "vfs_staged_files");
Utils.OnQueue(() =>
{
if (Directory.Exists(_stagedRoot)) if (Directory.Exists(_stagedRoot))
DeleteDirectory(_stagedRoot); DeleteDirectory(_stagedRoot);
});
Directory.CreateDirectory(_stagedRoot); Directory.CreateDirectory(_stagedRoot);
} }
private static void DeleteDirectory(string path) private static void DeleteDirectory(string path)
{ {
foreach (var file in Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories)) Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories)
.DoProgress("Cleaning VFS Files", file =>
{ {
File.SetAttributes(file, FileAttributes.Normal);
try try
{ {
var fi = new FileInfo(file);
fi.Attributes &= ~FileAttributes.ReadOnly;
File.Delete(file); File.Delete(file);
} }
catch (Exception ex) catch (Exception ex)
{ {
Utils.Log(ex.ToString()); Utils.Log(ex.ToString());
} }
} });
try {
Directory.EnumerateDirectories(path, DirectoryEnumerationOptions.Recursive)
.DoProgress("Cleaning VFS Folders", folder =>
{
try
{
if (!Directory.Exists(folder))
return;
var di = new DirectoryInfo(folder);
di.Attributes &= ~FileAttributes.ReadOnly;
Directory.Delete(path, true); Directory.Delete(path, true);
} }
catch (Exception ex) catch (Exception ex)
{ {
Utils.Log(ex.ToString()); Utils.Log(ex.ToString());
} }
});
} }
@ -365,7 +384,7 @@ namespace VFS
{ {
var tmp_path = Path.Combine(_stagedRoot, Guid.NewGuid().ToString()); var tmp_path = Path.Combine(_stagedRoot, Guid.NewGuid().ToString());
FileExtractor.ExtractAll(group.Key.StagedPath, tmp_path); FileExtractor.ExtractAll(group.Key.StagedPath, tmp_path);
Paths.Add(tmp_path);
foreach (var file in group) foreach (var file in group)
file._stagedPath = Path.Combine(tmp_path, file.Paths[group.Key.Paths.Length]); file._stagedPath = Path.Combine(tmp_path, file.Paths[group.Key.Paths.Length]);

View File

@ -83,7 +83,7 @@ namespace Wabbajack.Common
var info = new ProcessStartInfo var info = new ProcessStartInfo
{ {
FileName = "7z.exe", FileName = "7z.exe",
Arguments = $"x -o\"{dest}\" \"{source}\"", Arguments = $"x -bsp1 -y -o\"{dest}\" \"{source}\"",
RedirectStandardError = true, RedirectStandardError = true,
RedirectStandardInput = true, RedirectStandardInput = true,
RedirectStandardOutput = true, RedirectStandardOutput = true,
@ -104,6 +104,28 @@ namespace Wabbajack.Common
} }
catch (Exception) { } catch (Exception) { }
var name = Path.GetFileName(source);
try
{
while (!p.HasExited)
{
var line = p.StandardOutput.ReadLine();
if (line == null)
break;
int percent = 0;
if (line.Length > 4 && line[3] == '%')
{
Int32.TryParse(line.Substring(0, 3), out percent);
Utils.Status($"Extracting {name} - {line.Trim()}", percent);
}
}
}
catch (Exception ex)
{
}
p.WaitForExit(); p.WaitForExit();
if (p.ExitCode != 0) if (p.ExitCode != 0)
{ {
@ -113,7 +135,6 @@ namespace Wabbajack.Common
} }
/// <summary> /// <summary>
/// Returns true if the given extension type can be extracted /// Returns true if the given extension type can be extracted
/// </summary> /// </summary>

View File

@ -7,11 +7,15 @@ using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net.Configuration;
using System.Net.Http; using System.Net.Http;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using File = Alphaleonis.Win32.Filesystem.File;
using FileInfo = Alphaleonis.Win32.Filesystem.FileInfo;
using Path = Alphaleonis.Win32.Filesystem.Path;
namespace Wabbajack.Common namespace Wabbajack.Common
{ {
@ -301,6 +305,21 @@ namespace Wabbajack.Common
return; return;
} }
public static void DoProgress<T>(this IEnumerable<T> coll, String msg, Action<T> f)
{
var lst = coll.ToList();
lst.DoIndexed((idx, i) =>
{
Status(msg, idx * 100 / lst.Count);
f(i);
});
}
public static void OnQueue(Action f)
{
new List<bool>().Do(_ => f());
}
public static HttpResponseMessage GetSync(this HttpClient client, string url) public static HttpResponseMessage GetSync(this HttpClient client, string url)
{ {
var result = client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead); var result = client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);

View File

@ -10,7 +10,7 @@ namespace Wabbajack.Common
{ {
public class WorkQueue public class WorkQueue
{ {
internal static BlockingCollection<Action> Queue = new BlockingCollection<Action>(); internal static BlockingCollection<Action> Queue = new BlockingCollection<Action>(new ConcurrentStack<Action>());
[ThreadStatic] [ThreadStatic]
private static int CpuId; private static int CpuId;