babalae/better-genshin-impact · error · FileNotFoundException

未找到 的素材文件夹

Error message

未找到{featName}的素材文件夹

What it means

Thrown by GameTaskManager.LoadAssetImage when neither a resolution-specific Assets folder (e.g. 2560x1440) nor the fallback 1920x1080 folder exists for the given task feature name. The method first tries a folder matching the actual game screen size, then falls back to 1920x1080. If both are absent, the FileNotFoundException fires, halting asset loading for that task.

Solutions

  1. Verify the directory GameTask\{featName}\Assets\1920x1080 exists relative to Global.Absolute — create it or restore it from source control.
  2. Check that featName passed to LoadAssetImage exactly matches the folder name on disk (case-sensitive on some file systems).
  3. If running from a published build, ensure the build/publish step copies the Assets folder into the output directory.
  4. Add a Directory.Exists pre-check before calling LoadAssetImage and log the resolved absolute path for easier diagnosis.

Example fix

// before
var assetsFolder = Global.Absolute($@"GameTask\{featName}\Assets\1920x1080");
if (!Directory.Exists(assetsFolder))
    throw new FileNotFoundException($"未找到{featName}的素材文件夹");

// after — log resolved path so the caller can diagnose
if (!Directory.Exists(assetsFolder))
    throw new FileNotFoundException(
        $"未找到{featName}的素材文件夹,期望路径:{assetsFolder}", assetsFolder);
Defensive patterns

Strategy: validation

Validate before calling

// Check before calling LoadAssetImage
var fallbackFolder = Global.Absolute($@"GameTask\{featName}\Assets\1920x1080");
if (!Directory.Exists(fallbackFolder))
{
    logger.LogError("素材文件夹不存在:{Path}", fallbackFolder);
    return; // or skip task
}

Try / catch

try { var mat = GameTaskManager.LoadAssetImage(featName, name, systemInfo); }
catch (FileNotFoundException ex) { logger.LogError(ex, "素材加载失败:{FeatName}", featName); /* skip or fallback */ }

Prevention

When it happens

Trigger: Calling LoadAssetImage(featName, ...) where featName maps to a GameTask\{featName}\Assets directory that does not exist on disk. This happens when featName is misspelled, the task folder was never shipped, or a clean/partial build omitted the Assets directory.

Common situations: Running the app from a non-standard working directory where Global.Absolute resolves to a path without the Assets tree; cloning the repo without pulling large asset files (LFS); renaming or refactoring a task folder name without updating the featName callers.

Related errors


AI-assisted analysis of babalae/better-genshin-impact@a7cb36712d (2026-08-13). Data as JSON: /api/errors/7b76b00f1dada56e. Report an issue: GitHub.

Appendix: source

Thrown at BetterGenshinImpact/GameTask/GameTaskManager.cs:164

        return LoadAssetImage(featName, assertName, TaskContext.Instance().SystemInfo, flags);
    }

    /// <summary>
    /// 获取素材图片并缩放
    /// </summary>
    /// <returns></returns>
    /// <exception cref="FileNotFoundException"></exception>
    public static Mat LoadAssetImage(string featName, string assertName, ISystemInfo systemInfo, ImreadModes flags = ImreadModes.Color)
    {
        var assetsFolder = Global.Absolute($@"GameTask\{featName}\Assets\{systemInfo.GameScreenSize.Width}x{systemInfo.GameScreenSize.Height}");
        if (!Directory.Exists(assetsFolder))
        {
            assetsFolder = Global.Absolute($@"GameTask\{featName}\Assets\1920x1080");
        }

        if (!Directory.Exists(assetsFolder))
        {
            throw new FileNotFoundException($"未找到{featName}的素材文件夹");
        }

        var filePath = Path.Combine(assetsFolder, assertName);
        if (!File.Exists(filePath))
        {
            throw new FileNotFoundException($"未找到{featName}中的{assertName}文件");
        }

        var mat = Mat.FromStream(File.OpenRead(filePath), flags);
        if (systemInfo.GameScreenSize.Width != 1920)
        {
            mat = ResizeHelper.Resize(mat, systemInfo.AssetScale);
        }

        return mat;
    }

    /// <summary>

View on GitHub (pinned to a7cb36712d)