forked from Lurler/TrimKit.VirtualFileSystem
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
197 lines (168 loc) · 8.14 KB
/
Copy pathProgram.cs
File metadata and controls
197 lines (168 loc) · 8.14 KB
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
using System.Diagnostics;
using TrimKit.VirtualFileSystem;
namespace VFSTest;
class Program
{
static void Main()
{
UsageTests();
Microbench();
Console.ReadLine();
}
public static void UsageTests()
{
// Create VFS and include several mod folders
using var vfs = new VFSManager();
vfs.AddRootContainer("Data/Mod1.pak"); // folder with the name "Mod1.pak"
vfs.AddRootContainer("Data/Mod2.pak/"); // folder with the name "Mod2.pak" with a trailing slash
vfs.AddRootContainer("Data/Mod3.pak"); // zip archive with the name "Mod3.pak"
// first display all files
Console.WriteLine("Entries in VFS: ");
foreach (var item in vfs.Entries)
{
Console.WriteLine("> " + item);
}
Console.WriteLine();
// and also folders
Console.WriteLine("Folders in VFS: ");
foreach (var item in vfs.Folders)
{
Console.WriteLine("> " + item);
}
Console.WriteLine();
// iterate over all of the files and get their contents
Console.WriteLine("Reading file contents: ");
foreach (string path in vfs.Entries)
{
// get file stream
var stream = vfs.GetFileStream(path);
// convert it to text reader
TextReader textReader = new StreamReader(stream);
// read all text
var text = textReader.ReadToEnd();
// display the text
Console.WriteLine("Virtual path [" + path + "] -> \"" + text + "\"");
}
// also we can check to see if a particular file exists in the VFS
var nonExistentFilePath = "non-existent-file.txt";
if (vfs.FileExists(nonExistentFilePath))
{
Console.WriteLine("File [" + nonExistentFilePath + "] exists.");
}
else
{
Console.WriteLine("File [" + nonExistentFilePath + "] does not exist.");
}
Console.WriteLine();
// count files
Console.WriteLine("Files count in folder [] -> " + vfs.GetFilesInFolder("").Count);
Console.WriteLine("Files count in folder [/] -> " + vfs.GetFilesInFolder("/").Count);
Console.WriteLine("Files count in folder [folder] -> " + vfs.GetFilesInFolder("folder").Count);
Console.WriteLine("Files count in folder [folder/] -> " + vfs.GetFilesInFolder("folder/").Count);
Console.WriteLine("Files count in folder [folder2] -> " + vfs.GetFilesInFolder("folder2").Count);
Console.WriteLine("Files count in folder [folder2/] -> " + vfs.GetFilesInFolder("folder2/").Count);
Console.WriteLine("Files count in folder [] with extension [txt] -> " + vfs.GetFilesInFolder("", "txt").Count);
Console.WriteLine();
// check recursion
Console.WriteLine("Get file list:");
var list1 = vfs.GetFilesInFolder("", false);
Console.WriteLine("Files in root no recursion: " + string.Join(", ", list1));
var list2 = vfs.GetFilesInFolder("", true);
Console.WriteLine("Files in root with recursion: " + string.Join(", ", list2));
var list3 = vfs.GetFilesInFolder("folder/", false);
Console.WriteLine("Files in \"folder\" folder no recursion: " + string.Join(", ", list3));
var list4 = vfs.GetFilesInFolder("folder/", true);
Console.WriteLine("Files in \"folder\" folder with recursion: " + string.Join(", ", list4));
Console.WriteLine();
// check recursion 2
Console.WriteLine("Get folder list:");
var list5 = vfs.GetFoldersInFolder("", false);
Console.WriteLine("Folders in root no recursion: " + string.Join(", ", list5));
var list6 = vfs.GetFoldersInFolder("", true);
Console.WriteLine("Folders in root with recursion: " + string.Join(", ", list6));
var list7 = vfs.GetFoldersInFolder("folder/", false);
Console.WriteLine("Folders in \"folder\" no recursion: " + string.Join(", ", list7));
var list8 = vfs.GetFoldersInFolder("folder/", true);
Console.WriteLine("Folders in \"folder\" with recursion: " + string.Join(", ", list8));
Console.WriteLine();
// file info check
Console.WriteLine("FileInfo OS test:");
var fileInfoOs = vfs.GetFileInfo("folder/file3.txt");
Console.WriteLine("Name: " + fileInfoOs.Name);
Console.WriteLine("Extension: " + fileInfoOs.Extension);
Console.WriteLine("Size: " + fileInfoOs.Size);
Console.WriteLine("ContainerType: " + fileInfoOs.ContainerType);
Console.WriteLine("LastWriteTime: " + fileInfoOs.LastWriteTime);
Console.WriteLine("VfsPath: " + fileInfoOs.VfsPath);
Console.WriteLine("VfsFolder: " + fileInfoOs.VfsFolder);
Console.WriteLine();
// file info check
Console.WriteLine("FileInfo Zip test:");
var fileInfoZip = vfs.GetFileInfo("folder2/file5.txt");
Console.WriteLine("Name: " + fileInfoZip.Name);
Console.WriteLine("Extension: " + fileInfoZip.Extension);
Console.WriteLine("Size: " + fileInfoZip.Size);
Console.WriteLine("ContainerType: " + fileInfoZip.ContainerType);
Console.WriteLine("LastWriteTime: " + fileInfoZip.LastWriteTime);
Console.WriteLine("VfsPath: " + fileInfoZip.VfsPath);
Console.WriteLine("VfsFolder: " + fileInfoZip.VfsFolder);
Console.WriteLine();
// other checks
Console.WriteLine("Other tests:");
Console.WriteLine("Folder \"folder\" exists: " + vfs.FolderExists("folder"));
Console.WriteLine("Folder \"folder/\" exists: " + vfs.FolderExists("folder/"));
Console.WriteLine("Folder \"folder/subfolder\" exists: " + vfs.FolderExists("folder/subfolder"));
Console.WriteLine("Folder \"folder/subfolder/\" exists: " + vfs.FolderExists("folder/subfolder/"));
Console.WriteLine("Folder \"folder/subfolder/sub-sub-folder\" exists: " + vfs.FolderExists("folder/subfolder/sub-sub-folder"));
Console.WriteLine("Folder \"folder/subfolder/sub-sub-folder/\" exists: " + vfs.FolderExists("folder/subfolder/sub-sub-folder/"));
Console.WriteLine();
// packaging and obfuscation test
Console.WriteLine("Packaging and obfuscation test:");
Console.WriteLine("Packaging folder into a pack file with a password.");
var password = "Super Secret Password";
VFSManager.PackFolder("Data/Mod1.pak/", "Data/packaged.pak", password);
Console.WriteLine("Creating new VFS.");
using var vfs2 = new VFSManager();
vfs2.AddEncryptedContainer("Data/packaged.pak", password);
// iterate over all of the files and get their contents
Console.WriteLine("Reading file contents: ");
foreach (string path in vfs2.Entries)
{
var text = vfs2.GetFileContentsAsText(path);
Console.WriteLine("Virtual path [" + path + "] -> \"" + text + "\"");
}
Console.WriteLine();
// leaving scope, so dispose should be called now.
}
public static void Microbench()
{
// creating vfs with the same containers
using var vfs = new VFSManager();
vfs.AddRootContainer("Data/Mod1.pak");
vfs.AddRootContainer("Data/Mod2.pak/");
vfs.AddRootContainer("Data/Mod3.pak");
// possible read paths to use
string[] paths = { "file1.txt", "file4.txt", "folder2/file5.txt" };
// JIT warmup
foreach (var p in paths)
_ = vfs.GetFileContents(p);
// GC stabilize
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Console.WriteLine("");
Console.WriteLine("Starting benchmark:");
// start benchmark
const int N = 10_000;
var sw = Stopwatch.StartNew();
int idx = 0;
for (int i = 0; i < N; i++)
{
var bytes = vfs.GetFileContents(paths[idx++ % paths.Length]);
GC.KeepAlive(bytes); // so it is not optimized out of existence
}
sw.Stop();
Console.WriteLine($"Total: {sw.Elapsed.TotalMilliseconds:F2} ms for {N} iterations.");
Console.WriteLine($"Per iteration: {sw.Elapsed.TotalMilliseconds * 1000 / N:F2} µs");
}
}