Xamarin.Forms FileStream - 找不到文件

时间:2017-08-25 20:15:33

标签: file xamarin xamarin.android xamarin.forms

目前我正在尝试使用Xamarin.Forms从我的Android项目加载文件“json”。

这是我的代码:

var path = @"client_secret.json";
using (var stream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
}

对于路径,我尝试了很多不同的情况,将“client_secret.json”放在项目根文件夹,资产文件夹,bin,bin> Debug,bin> Release以及“.Droid”项目和PCL中。我还尝试将文件构建操作更改为“内容”,“嵌入式资源”,“附加文件”,“AndroidResource”和“AndroidEnvironment”。我还尝试更改“client_secret.json”并使用物理路径(D:\ Apps .... \ Project.Android \ client_secret.json)并尝试在不同的文件夹中找到它:

Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath

Directory.GetFiles(Directory.GetCurrentDirectory())

Directory.GetFiles(Android.OS.Environment.RootDirectory.AbsolutePath)

Directory.GetFiles(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal))

我仍然无处可寻。 “复制到输出”文件属性更改为“始终复制”,但仍然没有结果。

在这种情况下,有人知道我做错了什么来在这个文件上制作FileStream吗?

提前致谢

2 个答案:

答案 0 :(得分:3)

Using Android Assets

AssetManager assets = this.Assets;
using (StreamReader sr = new StreamReader (assets.Open ("client_secret.json")))
{
    content = sr.ReadToEnd ();
}

答案 1 :(得分:3)

1。为了使用FileStream - 您很可能需要绝对文件路径名;这对于资产文件是不可能的(在某些情况下,您可以像在WebView等中那样使用URL语法file:///android_asset/...,但不能在FileStream中使用);

What you can do is get access to InputStream using AssetManager ,应该与GoogleClientSecrets.Load()方法兼容。

using(var stream = this.Assets.Open(@"client_secret.json"))
{
     var secrets = GoogleClientSecrets.Load(stream).Secrets;
     ...

2。另一种选择是 copy your asset file to storage ,然后尝试使用目标路径在FileStream中进行访问。

var path = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), @"client_secret.json");
using (var asset = Assets.Open("client_secret.json"))
    using (var dest = System.IO.File.Create(path))
         asset.CopyTo(dest);

using (var stream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
    var secrets = GoogleClientSecrets.Load(stream).Secrets;
    ...
  

注意:对于选项1和2;确保您按照add this json file as an asset to android app

的步骤操作

3。下一个选项 would be to use embedded resources - 您可以使用Assembly.GetManifestResourceStream()访问文件。

var assembly = typeof(MainActivity).GetTypeInfo().Assembly;
using (var stream = assembly.GetManifestResourceStream("AssemblyNamespace.client_secret.json"))
{
    var secrets = GoogleClientSecrets.Load(stream).Secrets;
    ...
  

注意:对于选项3;请务必按照add this json file as an embedded resource to android app or assembly

的步骤操作