.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文件路径的代码,避免手动维护列表:
- 在项目的
.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 = { @"@(DriverConfig -> '%(Identity)', "," @")" }; }" Overwrite="true" Encoding="utf-8" /> </Target>
- 在代码中直接使用自动生成的类:
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
相关产品推荐
相关产品推荐

