1

我有一些配置文件作为我在 Windows Mobile 上的解决方案的一部分。我将代码移植到 MonoForAndroid 和 MonoTouch,所以我想尽可能地保持我的代码不变。

加载这些 xml 文件时,在 Windows Mobile 上工作正常,在我的上一个原型中它也适用于 iOS,但代码在 MonForAndroid 上不起作用

我有这些文件

/solution folder
    /My Documents/
        /Business
            App.Config
            Settings.Config

我将这些文件构建操作设置为Content,我可以看到它们被复制到/bin/Debug/但是当我尝试读取这些文件时,我得到以下异常:

System.IO.DirectoryNotFoundException

我看到这里有一个类似的问题但是他们建议使用AndroidResources,我不想这样做,需要这些文件的地方很多,所以我不想在很多地方更改它。

AndrodiResources, 是不可能的,如果可能的话,我想避免使用EmbededResources

啊,我正在阅读它的方式,非常简单xmDoc.Load(filePath)我也尝试过File.ReadAllText()我确保filePath是正确的,并且我使用Path.Combine()生成了路径以避免filePath / slashes的任何问题这是我构建我的文件路径

var filePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase).Replace(FileURIPrefix, ""), "My Documents", "Business");
filePath = Path.Combine(filePath, "App.Config");

而且我可以在调试器中看到filePath是正确的提前感谢您的帮助

4

1 回答 1

0

在四处搜索之后,当 MonoDroid 的构建操作设置为Content.

我必须创建一个名为的实体FileHelper,它在 Android 上以不同的方式实现,然后我使用它FileHelper.ReadAllText(string filename);

我将把我的实现放在这里,希望它可以使其他人受益。

Windows 移动和 iOS

    public class FileHelper 
    {
        public static string ReadAllText(string filePath)
        {
            var path = filePath.GetFullPath();
            if (!File.Exists(path))
            {
                Logging.LogHandler.LogError("File " + path + " does not exists");
                return string.Empty;
            }
            using (var reader = new StreamReader(filePath))
            {
                return reader.ReadToEnd();
            }
        }
   }

安卓版

public class FileHelper : BaseFileHelper 
{
    public static string ReadAllText(string filePath)
    {
        var entryAssemblyPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase).Replace("file:", ""), "MyExecutableAssemblyName.dll");
        // This is because Assembly.GetEntryAssembly() returns null on Android... Booohhh
        var assembly = Assembly.LoadFrom(entryAssemblyPath);
        using (var stream = assembly.GetManifestResourceStream(filePath.GetFullPath()))
        {
            using (var reader = new StreamReader(stream))
            {
                return reader.ReadToEnd();
            }
        }
    }
}

我有一个用于常量的共享代码和一个用于路径的扩展方法,如下所示

常量.cs

public static Class Constants
     {
        private static string _RootPath;
                private static string _iOSRootPath;
        private static string _AndroidResourcePath;

        public static string RootPath
        {
            get
            {
                if (string.IsNullOrEmpty(_RootPath))
                {
                    _RootPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase).Replace(FileURIPrefix, "") + "\\My Documents\\Business";
                }
                return _RootPath;
            }
        }

        public static string iOSRootPath
        {
            get
            {
                          if (!string.IsNullOrEmpty(_iOSRootPath)) 
                          {
                       _iOSRootPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase).Replace(FileURIPrefix, "").Replace("file:", ""), Path.Combine("My_Documents", "Business"));
                  }
                          return _iOSRootPath;
                     }
        }

        public static string AndroidResourcePath
        {
            get
            {
                if (string.IsNullOrEmpty(_AndroidResourcePath))
                {
                    _AndroidResourcePath = "Leopard.Delivery.My_Documents.Business.";
                }
                return _AndroidResourcePath;
            }
        }
  }

路径扩展.cs

public static class PathExtensions
    {
        public static string GetFullPath(this string filePath)
        {
            if (Platform.IsAndroid) // platform is a class that I have to tell me which platfrom I am at :)
            {
                return Constants.AndroidResourcePath + filePath;
            }
            if (Platform.IsIOS)
            {
                return Path.Combine(Constants.iOSRootPath, filePath);
            }
            return Path.Combine(Constants.RootPath, filePath);
        }
    }

设置完成后,我正在使用我FileHelper的就像下面一样简单

string configuratinContents = FileHelper.ReadAllText(configruationPath); 

对于使用此代码的任何人,请记住将构建操作设置为EmbededResources在 Android 上以及Content在 iOS 和 Windows Mobile 上。

于 2013-04-15T07:24:45.320 回答