在共享库Xamarin c#中读取文件

时间:2018-07-20 15:28:30

标签: c# xamarin

我已经在共享库中保存了一些.json文件。

我已经设法通过代码在iOS上正常阅读

string fileName = $"Files/file_name.json";

var path = Path.Combine(NSBundle.MainBundle.BundlePath, fileName);
using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
using (var streaReader = new StreamReader(stream))
{
    return streaReader.ReadToEnd();
}

但是,我一直在努力为Android做同样的事情。 由于资产位于共享库中,因此无法读取。

using (var stream = Application.Context.Assets.Open("Files/file_name.json))

如果我在Android项目中的Assets文件夹下有该文件,则可以使用上面的直播功能

我想保留用于两个平台的文件的一个副本。

2 个答案:

答案 0 :(得分:3)

  1. 将“共享”文件添加到解决方案中(在PCL / NetStd / Shared项目内的文件夹中就可以了,只需将构建类型设置为None)。

  2. 在您的Android项目中,建立到Assets中文件的链接,构建类型为AndroidAsset

  3. 在您的iOS项目中,使用构建类型为BundleResource的文件创建链接

Android示例:

  <ItemGroup>
    <AndroidAsset Include="..\Forms_30\her.png">
      <Link>Assets\her.png</Link>
    </AndroidAsset>
  </ItemGroup>

iOS示例:

  <ItemGroup>
    <BundleResource Include="..\Forms_30\her.png">
      <Link>her.png</Link>
    </BundleResource>
 </ItemGroup>

注意:您可以使用PCL / NetStd库中文件的起始位置来手动编辑.csproj或从Finder / Explorer中进行拖放,但可以选择创建链接

现在,您可以通过DI使用自己的平台相关代码,也可以使用Xamarin.Essentials从PCL / NetStd库访问这些只读的应用程序捆绑文件。

Xamarin.Essentials

using (var stream = await FileSystem.OpenAppPackageFileAsync("her.png"))
{
     ~~~
}

答案 1 :(得分:1)

这些文件是静态文件吗(例如,它们是安装包的一部分),还是由应用程序在运行时保存?

如果它们是静态的,则需要根据平台将它们放置在不同的位置。

对于iOS,您将文件放入Resources中,其构建类型为BundleResource,并使用NSBundle.MainBundle.PathForResource访问它们。

对于Android,文件进入构建类型为AndroidAsset的Assets中,并通过Assets.Open访问它们。

This page为您提供了更多详细信息。