ProjectArcade

Форк
0
124 строки · 3.7 Кб
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.IO;
6

7
namespace EmulatorLauncher.Common.FileFormats
8
{
9
    public class MultiDiskImageFile
10
    {
11
        public string[] Files { get; set; }
12

13
        public static MultiDiskImageFile FromFile(string file)
14
        {
15
            var files = new List<string>();
16

17
            string path = Path.GetDirectoryName(file);
18
            string ext = Path.GetExtension(file).ToLowerInvariant();
19
            if (ext == ".cue")
20
            {
21
                string start = "FILE";
22

23
                foreach (var line in File.ReadAllLines(file))
24
                {
25
                    if (string.IsNullOrEmpty(line) || !line.StartsWith(start))
26
                        continue;
27

28
                    var tokens = getTokens(line);
29
                    if (tokens.Length > 1)
30
                        files.Add(Path.Combine(path, tokens[1]));
31
                }
32
            }
33
            else if (ext == ".ccd")
34
            {
35
                string stem = Path.GetFileNameWithoutExtension(file);
36
                files.Add(Path.Combine(path, stem + ".cue"));
37
                files.Add(Path.Combine(path, stem + ".img"));
38
                files.Add(Path.Combine(path, stem + ".bin"));
39
                files.Add(Path.Combine(path, stem + ".sub"));
40
            }
41
            else if (ext == ".m3u")
42
            {
43
                foreach (var line in File.ReadAllLines(file))
44
                {
45
                    var trim = (line ?? "").Trim();
46

47
                    if (string.IsNullOrEmpty(trim) || trim[0] == '#' || trim[0] == '\\' || trim[0] == '/')
48
                        continue;
49

50
                    files.Add(Path.Combine(path, trim));
51
                }
52
            }
53
            else if (ext == ".gdi")
54
            {
55
                foreach (var line in File.ReadAllLines(file))
56
                {
57
                    var tokens = getTokens(line);
58
                    if (tokens.Length > 5 && tokens[4].Contains("."))
59
                        files.Add(Path.Combine(path, tokens[4]));
60
                }
61
            }
62

63
            if (files.Any())
64
                return new MultiDiskImageFile() { Files = files.ToArray() };
65

66
            return null;
67
        }
68

69
        private static string[] getTokens(string line)
70
        {
71
            var tokens = new List<string>();
72

73
            bool inString = false;
74
            int startPos = 0;
75

76
            int i = 0;
77
            while(i < line.Length)
78
            {
79
                char c = line[i];
80

81
                switch (c)
82
                {
83
                    case '\"':
84
                        inString = !inString;
85
                        if (inString)
86
                            startPos = i + 1;
87

88
                        if (!inString)
89
                        {
90
                            string value = line.Substring(startPos, i - startPos);
91
                            if (!string.IsNullOrEmpty(value))
92
                                tokens.Add(value);
93

94
                            startPos = i + 1;
95
                        }
96
                        break;
97

98
                    case '\0':
99
                    case ' ':
100
                    case '\t':
101
                    case '\r':
102
                    case '\n':
103
                        if (!inString)
104
                        {
105
                            string value = line.Substring(startPos, i - startPos);
106
                            if (!string.IsNullOrEmpty(value))
107
                                tokens.Add(value);
108

109
                            startPos = i + 1;
110
                        }
111
                        break;
112
                }
113

114
                if (c == '\0')
115
                    break;
116

117
                i++;
118
            }
119

120
            return tokens.ToArray();
121
        }
122
    }
123

124
}
125

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.