首页 > 解决方案 > 从正在运行的 iOS / macOS 应用程序实例(Xamarin Forms)获取资源文件夹路径的正确方法是什么

问题描述

我在从我的应用程序资源文件夹中复制一些文件时遇到困难:

   var myDocuments = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Library");

    // Confirm these paths are OK for iOS too
    var root = Path.Combine(myDocuments, "VisitsRota.MacOS");
    var styles = Path.Combine(root, "Styles");
    var stylesheet = Path.Combine(styles, "ElderlyInfirm-Schedule-v1.css");
    var db = Path.Combine(root, "ElderlyInfirmRotaData.xml");

    var defaultroot = Path.Combine( ".", "Resources");

    // Main folder
    if (!Directory.Exists(root))
    {
        Directory.CreateDirectory(root);
    }

    // Database
    if (!File.Exists(db))
    {
        var defaultdb = Path.Combine(defaultroot, "ElderlyInfirmRotaData.xml");
        File.Copy(defaultdb, db);
    }

    // Styles folder
    if (!Directory.Exists(styles))
    {
        Directory.CreateDirectory(styles);
    }

    // Stylesheet
    if (!File.Exists(stylesheet))
    {
        var defaultstylesheet = Path.Combine(defaultroot, "Styles", "ElderlyInfirm-Schedule-v1.css");
        File.Copy(defaultstylesheet, stylesheet);
    }

问题是确定应用程序文件夹资源文件夹,目前我得到这个异常:

在此处输入图像描述

访问 Resources 文件夹(对于 iOS 或 macOS)的正确方法是什么?

在 IDE 中,我只看到一个资源文件夹:

在此处输入图像描述

我的两个资源都有一个Build Action设置为Content

感谢您为我指出解决此问题的正确方向。


我尝试使用以下结果:

public static string GetExecutingDirectoryName()
{
    var location = new Uri(Assembly.GetEntryAssembly().GetName().CodeBase);
    return new FileInfo(location.AbsolutePath).Directory.FullName;
}

这是完全错误的。

我在 VS for Mac(macOS 构建)的调试器中运行该应用程序。


我假设为这些文件使用资源文件夹是可以的。除非有更好的方法来做到这一点?

标签: iosmacosxamarin.formsdirectory

解决方案


使用 BundleResource 要容易得多:

var myDocuments = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Library");

// Create the folders first

// Main folder
var root = Path.Combine(myDocuments, "VisitsRota.MacOS");
if (!Directory.Exists(root))
{
    Directory.CreateDirectory(root);
}

// Styles folder
var styles = Path.Combine(root, "Styles");
if (!Directory.Exists(styles))
{
    Directory.CreateDirectory(styles);
}

// Now copy the files

// Database
var db = Path.Combine(root, "ElderlyInfirmRotaData.xml");
var defaultdb = NSBundle.MainBundle.PathForResource("ElderlyInfirmRotaData", ofType: "xml");
if (!File.Exists(db))
{
    File.Copy(defaultdb, db);
}

// Stylesheet
var stylesheet = Path.Combine(styles, "ElderlyInfirm-Schedule-v1.css");
var defaultstylesheet = NSBundle.MainBundle.PathForResource("ElderlyInfirm-Schedule-v1", ofType: "css");
if (!File.Exists(stylesheet))
{
    File.Copy(defaultstylesheet, stylesheet);
}   

推荐阅读