上下文。
我正在开发 .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);
方法之外是否还有其他方法可以获取原始资产。
感谢对此的任何想法。谢谢!
当你在 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);
}