Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从xamarin中的绝对NSURL加载文件_C#_Ios_Xamarin_Xamarin.ios - Fatal编程技术网

C# 如何从xamarin中的绝对NSURL加载文件

C# 如何从xamarin中的绝对NSURL加载文件,c#,ios,xamarin,xamarin.ios,C#,Ios,Xamarin,Xamarin.ios,我正在使用Xamarin for IOS开发一个应用程序,以opengl游戏模板为起点 我已将我的应用程序设置为能够打开特定的文件格式,并已覆盖AppDelegate.cs中的OpenURL委托 问题是如果我这样做: public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation) { Str

我正在使用Xamarin for IOS开发一个应用程序,以opengl游戏模板为起点

我已将我的应用程序设置为能够打开特定的文件格式,并已覆盖AppDelegate.cs中的OpenURL委托

问题是如果我这样做:

 public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
        {

            Stream bob = new FileStream(url.AbsoluteString, FileMode.Open,  FileAccess.Read);
            return true;
        }
我得到了一个例外

"Unable to open file : /private/var/mobile/Applications/A7B5E435-F7D1-4985-BA97-C243E63EFC39/MyApp.app/file:///private/var/mobile/Applications/A7B5E435-F7D1-4985-BA97-C243E63EFC39/Documents/Inbox/A%20File%20To%20Open.ext"
这似乎是因为url.AbsoluteString返回file:///... 部分但FileStream始终希望相对于应用程序的bundle dir,有一个更干净的路径(例如用空格替换%20s)

/private/var/mobile/Applications/A7B5E435-F7D1-4985-BA97-C243E63EFC39/MyApp.app/
最后,我让它以一种非常简单的方式工作:使用url.AbsoluteString,删除“file:///”部分,在开头添加一堆../../../../etc,并将“%20”替换为“”

这起作用了。。。但它似乎骇人听闻。那么,使用Xamarin从指向文件的NSURL获取可读文件流的正确方法是什么


(注意,这是在IOS 7上,在IOS 9中,传入的路径在许多方面不同于FileStream的默认目录,并且在目录树中处于较高的级别)

您可以通过以下属性检索
NSUrl
的文件路径组件:

string fname = url.Path;
Stream bob = new FileStream(fname, FileMode.Open,  FileAccess.Read);
return true;

这将返回绝对文件路径并将
%20
解码到空格中。

使用
NSUrl
类上的
Path
属性:

NSString urlString = new NSString("file:///stack/over%20flow/foobar.txt");
NSUrl myFileUrl = new NSUrl (urlString);
Console.WriteLine (myFileUrl.AbsoluteString);
string absPath = myFileUrl.Path;
Console.WriteLine (absPath);

2016-04-12 18:38:53.809 filepath[11174:1132929] file:///stack/over%20flow/foobar.txt
2016-04-12 18:38:53.814 filepath[11174:1132929] /stack/over flow/foobar.txt

参考:

NSUrl的来源是什么?这是来自文件选择器吗?我最近实现了非常类似的行为。谢谢,这回答了我的部分问题,但对于new FileStream()需要问题中提到的某个随机路径的相对路径这一事实没有帮助
NSString urlString = new NSString("file:///stack/over%20flow/foobar.txt");
NSUrl myFileUrl = new NSUrl (urlString);
Console.WriteLine (myFileUrl.AbsoluteString);
string absPath = myFileUrl.Path;
Console.WriteLine (absPath);

2016-04-12 18:38:53.809 filepath[11174:1132929] file:///stack/over%20flow/foobar.txt
2016-04-12 18:38:53.814 filepath[11174:1132929] /stack/over flow/foobar.txt