PkgInst

Форк
0
/
PackageHelper.cs 
91 строка · 3.1 Кб
1
using System.Collections.Concurrent;
2
using System.Diagnostics;
3
using System.Reflection;
4

5
namespace PkgInst.Benchmark;
6

7
public class PackageHelper
8
{
9
    private readonly string _basePath;
10
    private readonly string _appPath;
11

12
    public PackageHelper(string basePath)
13
    {
14
        _basePath = basePath;
15
        _appPath = Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location) ?? throw new DirectoryNotFoundException();
16
    }
17

18
    public IEnumerable<Package> GetPackages()
19
    {
20
        var list = new List<Package>();
21

22
        foreach (var packageId in new DirectoryInfo(_basePath).GetDirectories().Select(x => x.Name))
23
        {
24
            var packageInfo = GetPackageInfo(packageId);
25
            var fileInfo = new FileInfo(Path.Combine(_basePath, packageId, "installer.exe"));
26

27
            string name = packageInfo.Item1;
28
            string url = $"/download?id={packageId}&name={name}";
29
            long size = fileInfo.Length;
30
            DateTime dateTimeCreated = fileInfo.LastWriteTime;
31
            string parameters = packageInfo.Item2;
32

33
            list.Add(new Package(packageId, name, url, size, dateTimeCreated, parameters));
34
        }
35

36
        return list;
37
    }
38

39
    public IEnumerable<Package> GetPackagesInParallel()
40
    {
41
        var list = new ConcurrentBag<Package>();
42

43
        Parallel.ForEach(new DirectoryInfo(_basePath).GetDirectories().Select(x => x.Name), packageId =>
44
        {
45
            var packageInfo = GetPackageInfo(packageId);
46
            var fileInfo = new FileInfo(Path.Combine(_basePath, packageId, "installer.exe"));
47

48
            string name = packageInfo.Item1;
49
            string url = $"/download?id={packageId}&name={name}";
50
            long size = fileInfo.Length;
51
            DateTime dateTimeCreated = fileInfo.LastWriteTime;
52
            string parameters = packageInfo.Item2;
53

54
            list.Add(new Package(packageId, name, url, size, dateTimeCreated, parameters));
55
        });
56

57
        return list;
58
    }
59

60
    public (string, string) GetPackageInfo(string packageId)
61
    {
62
        string tempPath = ExtractPackage(packageId, Path.Combine("pkg_1", "executable_package.kpd"));
63

64
        string[] lines = File.ReadAllLines(Path.Combine(tempPath, "executable_package.kpd"));
65
        string name = lines.FirstOrDefault(x => x.StartsWith("LocalizedName="))!.Split('=')[1];
66
        string parameters = string.Join('=', lines.FirstOrDefault(x => x.StartsWith("Params="))!.Split('=').Skip(1));
67

68
        Directory.Delete(tempPath, true);
69

70
        return (string.IsNullOrWhiteSpace(name) ? "installer.exe" : name, parameters);
71
    }
72

73
    public string ExtractPackage(string packageId, string nameToExtract)
74
    {
75
        string packagePath = Path.Combine(_basePath, packageId, "installer.exe");
76
        string guid = Guid.NewGuid().ToString();
77
        string tempPath = Path.Combine(_appPath, "temp", guid);
78

79
        var processInfo = new ProcessStartInfo
80
        {
81
            FileName = "7za",
82
            Arguments = $"e \"{packagePath}\" -aoa -o\"{tempPath}\" \"{nameToExtract}\"",
83
            WindowStyle = ProcessWindowStyle.Hidden
84
        };
85

86
        var process = Process.Start(processInfo);
87
        process?.WaitForExit();
88

89
        return tempPath;
90
    }
91
}
92

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

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

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

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