Поиск исполняемых файлов игрового лаунчера в каталоге C # - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь найти исполняемые файлы для игр;однако некоторые из них являются вложенными (например, Ark: Survival Evolved) ( A: \ Steam Games \ steamapps \ common \ ARK \ ShooterGame \ Binaries \ Win64 \ ShooterGame.exe )

У меня естьпотратил целую вечность, пытаясь найти способ найти только исполняемые файлы, которые имеют отношение к делу.

Эта ссылка показывает игры, когда мы не проводим рекурсивный поиск.Он находит большинство, но не все .exe

Эта ссылка показывает рекурсивный поиск игр, но также показывает кучу исполняемых файлов / повторных файлов.

Изначально я пытался исключить "Папки bin,, binary, binaries, redist, но это не дало мне, например, Ark: Survival Evolved.

Я также рассмотрел возможность фильтрации файлов .exe по их размеру, но по Aperture.Тэг имеет QC_Eyes.exe на 3055 КБ, но Tomb Raider II.exe имеет размер 892 КБ.

Вот метод, который я использую, чтобы найти каталог установки steam и проверить libraryfolders.vdf.файл для расположения библиотеки.Сейчас я просто пишу в консоль, чтобы увидеть, какие выходы есть.

Если у кого-нибудь есть какие-либо советы о том, как мне найти нужные файлы для правильных игр, это было бы очень полезно.Спасибо

        public void SearchSteam()
    {
        steamGameDirs.Clear();
        string steam32 = "SOFTWARE\\VALVE\\";
        string steam64 = "SOFTWARE\\Wow6432Node\\Valve\\";
        string steam32path;
        string steam64path;
        string config32path;
        string config64path;
        RegistryKey key32 = Registry.LocalMachine.OpenSubKey(steam32);
        RegistryKey key64 = Registry.LocalMachine.OpenSubKey(steam64);

        foreach(string k32subKey in key32.GetSubKeyNames())
        {
            using (RegistryKey subKey = key32.OpenSubKey(k32subKey))
            {
                steam32path = subKey.GetValue("InstallPath").ToString();
                config32path = steam32path + "/steamapps/libraryfolders.vdf";
                if (File.Exists(config32path))
                {
                    string[] configLines = File.ReadAllLines(config32path);
                    foreach(var item in configLines)
                    {
                        Console.WriteLine("32:  " + item);
                    }
                }
            }
        }

        foreach(string k64subKey in key64.GetSubKeyNames())
        {
            using (RegistryKey subKey = key64.OpenSubKey(k64subKey))
            {
                steam64path = subKey.GetValue("InstallPath").ToString();
                config64path = steam64path + "/steamapps/libraryfolders.vdf";
                string driveRegex = @"[A-Z]:\\";
                if (File.Exists(config64path))
                {
                    string[] configLines = File.ReadAllLines(config64path);
                    foreach (var item in configLines)
                    {
                        Console.WriteLine("64:  " + item);
                        Match match = Regex.Match(item, driveRegex);
                        if(item != string.Empty && match.Success)
                        {
                            string matched = match.ToString();
                            string item2 = item.Substring(item.IndexOf(matched));
                            item2 = item2.Replace("\\\\", "\\");
                            steamGameDirs.Add(item2);
                        }
                    }
                    steamGameDirs.Add(steam64path + "\\steamapps\\common\\");
                }
            }
        }

        foreach(string item in steamGameDirs)
        {
            string GameTitle;
            string[] Executables = new string[0];
            string[] steamGames = Directory.GetDirectories(item);
            foreach (var dir in steamGames)
            {
                string title = dir.Substring(dir.IndexOf("\\common\\"));
                string[] titlex = title.Split('\\');
                title = titlex[2].ToString();
                GameTitle = title;
                Console.WriteLine("Title: " + GameTitle);
                Console.WriteLine("Directory: " + dir);
                string[] executables = Directory.GetFiles(dir, "*.exe", SearchOption.AllDirectories);
                int num = 0;
                foreach (var ex in executables)
                {
                    //add "ex" to Executables[] if poss
                    Console.WriteLine(ex);
                    num++;
                }
            }

        }
    }

1 Ответ

0 голосов
/ 26 февраля 2019

Мне удалось сделать то, что я могу, поэтому сначала я определяю, где Steam установлен через реестр, затем проверяю /steamapps/libraryfolders.vdf, где находятся пользовательские библиотеки, затем проверяю эти библиотеки на любой «верхний уровень».исполняемые файлы.Затем программа позволяет пользователю выбрать свой собственный исполняемый файл, если он не найден в верхнем каталоге.

Похоже, лучшее решение на данный момент, поскольку модуль steamfiles в данный момент не активен.

public void SearchSteam()
{
    steamGameDirs.Clear();
    string steam32 = "SOFTWARE\\VALVE\\";
    string steam64 = "SOFTWARE\\Wow6432Node\\Valve\\";
    string steam32path;
    string steam64path;
    string config32path;
    string config64path;
    RegistryKey key32 = Registry.LocalMachine.OpenSubKey(steam32);
    RegistryKey key64 = Registry.LocalMachine.OpenSubKey(steam64);
    if (key64.ToString() == null || key64.ToString() == "")
    {
        foreach (string k32subKey in key32.GetSubKeyNames())
        {
            using (RegistryKey subKey = key32.OpenSubKey(k32subKey))
            {
                steam32path = subKey.GetValue("InstallPath").ToString();
                config32path = steam32path + "/steamapps/libraryfolders.vdf";
                string driveRegex = @"[A-Z]:\\";
                if (File.Exists(config32path))
                {
                    string[] configLines = File.ReadAllLines(config32path);
                    foreach (var item in configLines)
                    {
                        Console.WriteLine("32:  " + item);
                        Match match = Regex.Match(item, driveRegex);
                        if (item != string.Empty && match.Success)
                        {
                            string matched = match.ToString();
                            string item2 = item.Substring(item.IndexOf(matched));
                            item2 = item2.Replace("\\\\", "\\");
                            item2 = item2.Replace("\"", "\\steamapps\\common\\");
                            steamGameDirs.Add(item2);
                        }
                    }
                    steamGameDirs.Add(steam32path + "\\steamapps\\common\\");
                }
            }
        }
    }
    foreach(string k64subKey in key64.GetSubKeyNames())
    {
        using (RegistryKey subKey = key64.OpenSubKey(k64subKey))
        {
            steam64path = subKey.GetValue("InstallPath").ToString();
            config64path = steam64path + "/steamapps/libraryfolders.vdf";
            string driveRegex = @"[A-Z]:\\";
            if (File.Exists(config64path))
            {
                string[] configLines = File.ReadAllLines(config64path);
                foreach (var item in configLines)
                {
                    Console.WriteLine("64:  " + item);
                    Match match = Regex.Match(item, driveRegex);
                    if(item != string.Empty && match.Success)
                    {
                        string matched = match.ToString();
                        string item2 = item.Substring(item.IndexOf(matched));
                        item2 = item2.Replace("\\\\", "\\");
                        item2 = item2.Replace("\"", "\\steamapps\\common\\");
                        steamGameDirs.Add(item2);
                    }
                }
                steamGameDirs.Add(steam64path + "\\steamapps\\common\\");
            }
        }
    }
}

Прикрепил код, чтобы другие могли видеть, как я это сделал.Я знаю, что это не самое лучшее, но работает

...