在目录C#中查找游戏启动器可执行文件

问题描述 投票:0回答:1

我正在尝试为游戏找到可执行文件;但有些是嵌套的(例如Ark:Survival Evolved)(A:\ Steam Games \ steamapps \ common \ ARK \ ShooterGame \ Binaries \ Win64 \ ShooterGame.exe)

我花了很多年时间试图找到一种方法来只找到相关的可执行文件。

当我们不递归搜索时,This link会显示游戏。它找到了大多数,但不是全部.exe的

This link显示了递归搜索的游戏,但也显示了一堆二进制文件/ redist exes。

最初我尝试排除“bin”,“binary”,“binaries”,“redist”文件夹,但那时没有给我Ark:Survival Evolved例如。

我还考虑根据它们的大小过滤.exe,但Aperture Tag的QC_Eyes.exe为3055KB,但Tomb Raider II.exe为892KB。

这是我用来查找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++;
                }
            }

        }
    }
c# exe executable steam
1个回答
2
投票

我已经设法尽我所能,所以首先我通过注册表检测蒸汽的安装位置,然后检查/steamapps/libraryfolders.vdf以查找用户库的位置,然后检查这些库是否有“顶级”可执行文件。然后程序允许用户选择自己的exe,如果在顶层目录中找不到。

现在似乎是最好的解决方案,因为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\\");
            }
        }
    }
}

附上代码,以便其他人可以看到我是如何做到的。我知道这不是最好的,但它正在发挥作用

© www.soinside.com 2019 - 2024. All rights reserved.