.Net Maui 列出资源原始文件夹下的资产

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

上下文。

我正在开发 .net Maui 移动应用程序,它使用一些本机 android 库,依赖于供应商提供的一堆配置文件。这些文件应该放在数据文件夹中,以便驱动程序正常工作。因此,理想情况下,在应用程序启动时,您只需遍历

\Resources\Raw\DriverConfigs\*.cfg 
文件夹内容,然后使用流读取器/写入器将每个文件复制到
FileSystem.Current.AppDataDirectory
中。虽然文件具有
Build Action = MauiAsset
属性。

问题和当前的解决方法。

现在的问题是似乎没有很好的方法来获取 Raw 文件夹中的文件列表。我可以一个一个地提供实际资源名称,如 MS 帮助 here 所述,但同样,我需要先获取资源列表才能遍历文件。 所以我最终得到了以下解决方法。我在一个项目中创建了单独的文件夹,并将我所有的驱动程序配置文件作为

Embedded Resource
放在那里。所以现在我可以使用以下代码轻松迭代并提取它们:

       private static void ExtractDriverConfigs()
       {
           var assembly = typeof(App).GetTypeInfo().Assembly;            
           
           foreach (var res in assembly.GetManifestResourceNames())
           {
               if (res.Contains(".cfg"))
               {
                   // read source file 
                   using var stream = assembly.GetManifestResourceStream(res);
                   using var reader = new StreamReader(stream);
                   var content = reader.ReadToEnd();

                   // generate target path inside data folder
                   string targetFile = System.IO.Path.Combine(FileSystem.Current.AppDataDirectory, res);
                   
                   // write file into data folder
                   using FileStream outputStream = System.IO.File.OpenWrite(targetFile);
                   using StreamWriter streamWriter = new StreamWriter(outputStream);

                   streamWriter.Write(content);
               }
           }
       }

这个解决方法就像一个魅力。我仍然认为它太多了,应该有更好的框架提供方法来使用现有的 Raw resources .net maui 功能。

实际问题。

抱歉介绍太长了。基本上,问题是使用框架提供的工具是否有更好的方法来做到这一点。很遗憾我无法使用现有框架提供的原始资源功能来解决它。也许有人知道除了现有的

await FileSystem.Current.OpenAppPackageFileAsync(filePath);
方法之外是否还有其他方法可以获取原始资产。

感谢对此的任何想法。谢谢!

.net assets maui embedded-resource
1个回答
0
投票

当你在 android 上工作时,你可以使用平台相关的代码,例如:

 public IEnumerable<string> ListAssets(string subfolder)
 {
    AssetManager assets = Platform.AppContext.Assets;
    string[] files = assets.List(subfolder);
    return files;
 }

假设您在“Resources/Raw/DriverConfigs”中有文件,然后调用

ListAssets("DriverConfigs");
将能够在该子文件夹中列出您的文件,并将构建操作设置为 MauiAsset,然后您可以通过扩展名等手动过滤它们

测试:

            var files= App.Native.ListAssets("DriverConfigs");    
            var fileName = files.First(); //will throw if no files..

            try
            {
                using var stream = await FileSystem.OpenAppPackageFileAsync($"DriverConfigs/{fileName}");
                using var reader = new StreamReader(stream);

                var content = await reader.ReadToEndAsync();
                   
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
© www.soinside.com 2019 - 2024. All rights reserved.