You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Maui如何获取Resources/Raw文件夹下的资产列表?

.NET Maui 遍历Raw资源并复制到AppData的优化方案

现状说明

.NET Maui目前没有原生API直接获取Resources\Raw文件夹下的文件列表,只能通过已知文件名调用FileSystem.Current.OpenAppPackageFileAsync访问单个Raw资源。你的临时Embedded Resource方案可行,但可以通过以下优化手段,不用切换Build Action,直接利用MauiAsset特性完成需求。


方案1:预定义文件名列表(适合少量/稳定文件)

如果配置文件数量不多且很少变动,直接在代码中定义所有文件路径,遍历复制即可:

private async Task CopyDriverConfigsAsync()
{
    // 定义Raw文件夹下的所有配置文件相对路径
    var configFilePaths = new List<string>
    {
        "DriverConfigs/config_a.cfg",
        "DriverConfigs/config_b.cfg",
        // 按需添加其他文件
    };

    foreach (var relativePath in configFilePaths)
    {
        // 打开Raw资源流
        using var sourceStream = await FileSystem.Current.OpenAppPackageFileAsync(relativePath);
        // 生成目标路径(仅保留文件名,避免嵌套路径冗余)
        var targetFilePath = Path.Combine(
            FileSystem.Current.AppDataDirectory, 
            Path.GetFileName(relativePath)
        );
        
        // 直接复制流(比读写文本更高效,支持二进制文件)
        using var targetStream = File.OpenWrite(targetFilePath);
        await sourceStream.CopyToAsync(targetStream);
    }
}

方案2:MSBuild自动生成文件列表(适合多文件/频繁变动)

如果配置文件数量多或经常增减,可以通过修改项目文件,让MSBuild自动生成包含所有.cfg文件路径的代码,避免手动维护列表:

  1. 在项目的.csproj文件中添加以下配置:
<ItemGroup>
  <!-- 匹配Raw下DriverConfigs文件夹的所有.cfg文件 -->
  <DriverConfig Include="Resources\Raw\DriverConfigs\*.cfg" />
</ItemGroup>

<Target Name="GenerateConfigFileList" BeforeTargets="BeforeBuild">
  <!-- 自动生成包含文件路径的C#类 -->
  <WriteLinesToFile 
    File="Generated\ConfigFileList.cs"
    Lines="namespace YourAppNamespace;
public static class ConfigFileList
{
    public static readonly string[] Files = {
        @&quot;@(DriverConfig -> '%(Identity)', &quot;,&quot;
        @&quot;)&quot;
    };
}"
    Overwrite="true" 
    Encoding="utf-8" />
</Target>
  1. 在代码中直接使用自动生成的类:
private async Task CopyDriverConfigsAsync()
{
    foreach (var relativePath in ConfigFileList.Files)
    {
        using var sourceStream = await FileSystem.Current.OpenAppPackageFileAsync(relativePath);
        var targetFilePath = Path.Combine(
            FileSystem.Current.AppDataDirectory, 
            Path.GetFileName(relativePath)
        );
        
        using var targetStream = File.OpenWrite(targetFilePath);
        await sourceStream.CopyToAsync(targetStream);
    }
}

临时方案的优化建议

如果继续使用Embedded Resource方案,可以优化流处理逻辑,提升效率并支持非文本文件:

private static void ExtractDriverConfigs()
{
    var assembly = typeof(App).GetTypeInfo().Assembly;            
    
    foreach (var resName in assembly.GetManifestResourceNames())
    {
        // 用EndsWith更精准匹配.cfg文件
        if (resName.EndsWith(".cfg", StringComparison.OrdinalIgnoreCase))
        {
            using var sourceStream = assembly.GetManifestResourceStream(resName);
            // 仅保留文件名,避免命名空间导致的长路径
            var targetFilePath = Path.Combine(
                FileSystem.Current.AppDataDirectory, 
                Path.GetFileName(resName)
            );
            
            // 直接复制流,无需读写文本
            using var targetStream = File.OpenWrite(targetFilePath);
            sourceStream.CopyTo(targetStream);
        }
    }
}

总结

目前.NET Maui确实没有原生的Raw资源列表枚举API,上述方案均为基于现有特性的优化实现,可根据你的文件数量、变动频率选择最适合的方式。

内容的提问来源于stack exchange,提问作者kudoku

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:35:24