Xamarin项目中如何获取指定文件夹及文件夹内的所有对象
Xamarin项目自定义文件夹及内容访问实现方案
核心实现前提
所有运行时对项目内文件夹的访问,都依赖文件对应的**生成操作(Build Action)**配置:如果仅在项目目录下手动新建文件夹、放入文件但不修改生成操作,文件不会被打包进最终安装包,运行时完全无法检索到相关内容。
具体实现方式
1. 跨平台通用的内嵌资源方案
这套方案不需要编写平台特定代码,适配Xamarin.Android、Xamarin.iOS、UWP全平台:
- 在Xamarin.Forms核心共享项目中新建
CuteAnimals文件夹,放入需要访问的图片资源 - 选中文件夹下所有资源文件,将生成操作设置为
EmbeddedResource - 可通过如下代码直接枚举指定文件夹下的所有资源:
// 获取当前核心项目的程序集对象 var coreAssembly = typeof(App).Assembly; // 读取程序集内所有内嵌资源的完整标识路径 var allResourceIdentifiers = coreAssembly.GetManifestResourceNames(); // 筛选出CuteAnimals文件夹下的资源(内嵌资源路径默认规则为:项目命名空间.文件夹层级.文件名) var cuteAnimalResourceList = allResourceIdentifiers .Where(resourcePath => resourcePath.Contains($"{coreAssembly.GetName().Name}.CuteAnimals.")) .ToList();
注意:内嵌资源会被直接打包到核心项目的DLL内部,不存在实体的文件夹文件路径,通过资源名称的路径前缀即可实现等效的文件夹层级检索效果。
2. 平台原生资源目录方案
如果需要直接在设备文件系统层面访问真实的文件夹路径,可将CuteAnimals文件夹放置在各平台指定的资源目录下:
- 对Android平台:将文件夹放入项目的
Assets目录,文件生成操作设置为AndroidAsset,枚举代码为:var assetManager = Android.App.Application.Context.Assets; var animalFileList = assetManager.List("CuteAnimals"); - 对iOS平台:将文件夹放入项目的
Resources目录,文件生成操作设置为BundleResource,枚举代码为:var rootBundlePath = NSBundle.MainBundle.BundlePath; var targetFolderPath = Path.Combine(rootBundlePath, "CuteAnimals"); var animalFileList = Directory.GetFiles(targetFolderPath);
常见踩坑点
- 不要使用默认生成操作
None的文件做运行时访问:这类文件仅存在于开发机的源代码目录中,不会被打包到APP安装包内,必然出现检索失败的问题。 - Android平台的Asset目录枚举不支持自动递归遍历,如果
CuteAnimals下存在嵌套子文件夹,需要手动逐层调用List方法获取所有层级的文件。 - 如果是做本地图集、批量图片加载类功能,优先选择内嵌资源方案,可大幅减少跨平台适配的代码量。
内容的提问来源于stack exchange,提问作者padalchik
相关产品推荐
相关产品推荐

