2013-04-11 89 views
1

我在Windows Mobile上有一些配置文件作爲我的解決方案的一部分。我將代碼移植到MonoForAndroid和MonoTouch,所以我想盡可能保持我的代碼不變。跨平臺讀取xml文件

當加載這些XML文件,在Windows Mobile正常工作,我在去年的原型,也努力在iOS上,但代碼不會對MonForAndroid

工作,我有這些文件

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

我有這些文件的生成操作設置爲Content,我可以看到他們被複制到/bin/Debug/但是當我嘗試讀取這些文件,我得到以下異常:

System.IO.DirectoryNotFoundException 

我看到here中有類似的問題,但他們建議使用AndroidResources,我不想這樣做,有很多放置在需要這些文件的地方,所以我不想在很多地方改變它。

AndrodiResources,是出了問題,如果可能的話,我想盡量避免使用EmbededResources

啊,我讀的方式,非常簡單xmDoc.Load(filePath)我也試過File.ReadAllText()我確信,該​​文件路徑是正確的,和我使用Path.Combine(),以避免與文件路徑/斜線 這是我如何構造我的文件路徑

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

而且我可以在文件路徑是正確的調試器看到任何問題產生的路徑 感謝您的幫助提前

+0

如何獲取XML文件的路徑? – 2013-04-11 07:23:55

回答

0

經過全面搜索後,我無法讓MonoDroid在構建操作設置爲Content時加載(或包含)我的文件。

我不得不創建一個實體,稱爲FileHelper它的實現方式不同,在Android上,然後我用FileHelper.ReadAllText(string filename);

我會把我在這裏實現,希望這將有利於其他人。

的Windows Mobile和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(); 
      } 
     } 
    } 

Android版本

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(); 
      } 
     } 
    } 
} 

我有常量的共享代碼和路徑如下

Constants.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; 
      } 
     } 
    } 

PathExtentions。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上。