-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProgram.cs
113 lines (109 loc) · 3.79 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GS_Pack
{
public static class Program
{
private static void PrintUsage()
{
Console.WriteLine("GS_Pack");
Console.WriteLine("-------");
Console.WriteLine("Griefsyndrome data file extractor/packer. By acaly.");
Console.WriteLine("Usage:");
Console.WriteLine(" -e <dat> <dir> Extract.");
Console.WriteLine(" -p <dir> <dat> Pack.");
}
private static void Main(string[] args)
{
if (args.Length != 3 || args[0] != "-e" && args[0] != "-p")
{
PrintUsage();
return;
}
if (args[0] == "-e")
{
if (!File.Exists(args[1]))
{
Console.WriteLine("File not exists.");
PrintUsage();
return;
}
if (!Directory.Exists(args[2]))
{
if (!Directory.Exists(Path.GetDirectoryName(args[2])))
{
Console.WriteLine("Only directory in the lowest level can be created.");
PrintUsage();
return;
}
}
else
{
Console.WriteLine("Output directory exists. Overwriting.");
}
Console.WriteLine("Extracting...");
using (var pack = Package.ReadPackageFile(args[1]))
{
Extract(pack, args[2]);
}
}
else if (args[0] == "-p")
{
if (!Directory.Exists(args[1]))
{
Console.WriteLine("Input directory not exists.");
PrintUsage();
return;
}
if (File.Exists(args[2]))
{
Console.WriteLine("File exists. Overwriting.");
}
Console.WriteLine("Packing...");
using (var pack = Package.CreateEmptyPackage())
{
Pack(pack, args[1]);
pack.SavePackageToFile(args[2]);
}
}
}
private static void Extract(Package package, string dir)
{
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
var maxLength = package.FileList.Max(file => file.Value.Length);
byte[] buffer = new byte[maxLength];
foreach (var file in package.FileList)
{
file.Value.Read(buffer, 0);
var subdir = Path.GetDirectoryName(Path.Combine(dir, file.Key));
if (!Directory.Exists(subdir))
{
Directory.CreateDirectory(subdir);
}
using (var output = File.OpenWrite(Path.Combine(dir, file.Key)))
{
output.Write(buffer, 0, file.Value.Length);
}
}
}
private static void Pack(Package package, string dir)
{
string dir2 = Path.Combine(dir, "./");
Uri uriDir = new Uri(dir2);
foreach (var file in Directory.EnumerateFiles(dir, "*.*", SearchOption.AllDirectories))
{
Uri uriFile = new Uri(file);
Uri uriRelative = uriDir.MakeRelativeUri(uriFile);
string relative = Uri.UnescapeDataString(uriRelative.ToString());
package.FileList.Add(relative, Package.CreateFileReference(file));
}
}
}
}