ProjectArcade
124 строки · 3.7 Кб
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.IO;
6
7namespace EmulatorLauncher.Common.FileFormats
8{
9public class MultiDiskImageFile
10{
11public string[] Files { get; set; }
12
13public static MultiDiskImageFile FromFile(string file)
14{
15var files = new List<string>();
16
17string path = Path.GetDirectoryName(file);
18string ext = Path.GetExtension(file).ToLowerInvariant();
19if (ext == ".cue")
20{
21string start = "FILE";
22
23foreach (var line in File.ReadAllLines(file))
24{
25if (string.IsNullOrEmpty(line) || !line.StartsWith(start))
26continue;
27
28var tokens = getTokens(line);
29if (tokens.Length > 1)
30files.Add(Path.Combine(path, tokens[1]));
31}
32}
33else if (ext == ".ccd")
34{
35string stem = Path.GetFileNameWithoutExtension(file);
36files.Add(Path.Combine(path, stem + ".cue"));
37files.Add(Path.Combine(path, stem + ".img"));
38files.Add(Path.Combine(path, stem + ".bin"));
39files.Add(Path.Combine(path, stem + ".sub"));
40}
41else if (ext == ".m3u")
42{
43foreach (var line in File.ReadAllLines(file))
44{
45var trim = (line ?? "").Trim();
46
47if (string.IsNullOrEmpty(trim) || trim[0] == '#' || trim[0] == '\\' || trim[0] == '/')
48continue;
49
50files.Add(Path.Combine(path, trim));
51}
52}
53else if (ext == ".gdi")
54{
55foreach (var line in File.ReadAllLines(file))
56{
57var tokens = getTokens(line);
58if (tokens.Length > 5 && tokens[4].Contains("."))
59files.Add(Path.Combine(path, tokens[4]));
60}
61}
62
63if (files.Any())
64return new MultiDiskImageFile() { Files = files.ToArray() };
65
66return null;
67}
68
69private static string[] getTokens(string line)
70{
71var tokens = new List<string>();
72
73bool inString = false;
74int startPos = 0;
75
76int i = 0;
77while(i < line.Length)
78{
79char c = line[i];
80
81switch (c)
82{
83case '\"':
84inString = !inString;
85if (inString)
86startPos = i + 1;
87
88if (!inString)
89{
90string value = line.Substring(startPos, i - startPos);
91if (!string.IsNullOrEmpty(value))
92tokens.Add(value);
93
94startPos = i + 1;
95}
96break;
97
98case '\0':
99case ' ':
100case '\t':
101case '\r':
102case '\n':
103if (!inString)
104{
105string value = line.Substring(startPos, i - startPos);
106if (!string.IsNullOrEmpty(value))
107tokens.Add(value);
108
109startPos = i + 1;
110}
111break;
112}
113
114if (c == '\0')
115break;
116
117i++;
118}
119
120return tokens.ToArray();
121}
122}
123
124}
125