在未知路径中查找目录 [已关闭]

Looking for a directory in an unknown path [closed]

提问人:Matthew2004 提问时间:11/10/2023 最后编辑:Mark RotteveelMatthew2004 更新时间:11/17/2023 访问量:60

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将有助于其他人回答这个问题。

7天前关闭。

我正在 C# Windows 窗体中处理我的应用程序,但我无法弄清楚这一点。我需要从未知路径的目录中获取一个文件。我觉得我已经尝试了我能找到的一切,但没有任何效果,或者可能还没有人向我正确解释。

这是我现在的 10iq 修复

现在,我正在检查几个可选文件夹,但这仍然不够,因为这个目录@“C:\Battlestate Games\EFT\EscapeFromTarkov_Data\StreamingAssets\Windows\assets\content” 总是有不同的路径。

有没有人知道如何在不知道路径的情况下访问文件夹?EscapeFromTarkov_Data\blablabla\blabla

此外,这是一个游戏目录,而不是我的程序目录或 Windows 目录。如果你想知道,我的应用程序正在作为游戏的文件修改器,这就是为什么我要弄乱另一个视频游戏的文件。

C# 文件 目录

评论

0赞 stuartd 11/10/2023
也许将 EnumerateDirectoriesEnumerationOptions.RecurseSubdirectories
3赞 President James K. Polk 11/10/2023
请阅读为什么我在提问时不应该上传代码/数据/错误的图片?
1赞 SmellyCat 11/10/2023
你选择的标准是什么?你能像 Stuart 建议的那样列举目录,直到找到一个名为“head_0_bundle”的目录吗?您能否通过将所有猜测放入字符串数组并返回与现有目录对应的第一个猜测来简化当前检查?esp_directory

答:

2赞 Henry Kwon 11/10/2023 #1

首先从可能的候选者中找到文件夹。EscapeFromTarkov_Data

我将它的父母分为两部分:

  • 驱动器根(如C:\)
  • 在根和自身之间(如EscapeFromTarkov_DataBattlestate Games\EFT)
using System.IO;
using System.Linq;

private string? GetDataPath()
{
    string[] candidates = {
        @"Battlestate Games\EFT",
        @"Battlestate Games",
        @"Tarkov",
        // add more candidates here
    };

    // Retrieving drive roots, such as @"C:\" and @"D:\"
    IEnumerable<string> roots =
        DriveInfo.GetDrives()
        .Where(d => d.DriveType == DriveType.Fixed)
        .Select(d => d.Name);

    // Matching every root and candidate, plus "EscapeFromTarkov_Data"
    var paths = 
        from root in roots
        from candidate in candidates
        select Path.Combine(root, candidate, "EscapeFromTarkov_Data");

    // Checking whether each of combination actually exists
    foreach (var path in paths)
    {
        if (Path.Exists(path))
            return path;
    }

    // If none of them exist...
    return null;
}

然后,使用前面的方法获取路径,以及该路径的完整路径的其余部分。Combine()

// If GetDataPath() is null, the following "is" statement returns false.
// Otherwise, it returns true and the value is stored to dataPath.
if (GetDataPath() is string dataPath)
    string esp_directory = Path.combine(
        dataPath, @"StreamingAssets\Windows\...\bear_head_0.bundle"
    );
else
    Application.Exit();