2016-04-13 5 views
1

私はIOS用のXamarinを使ってアプリケーションを開発していますが、OpenGLゲームテンプレートを最初に使用しました。絶対NSURLからのファイルをxamarinにロードするには

私はこれを行う場合は、問題がある

を特定のファイル形式を開くことができるように私のアプリを設定している、と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; 
     } 

/// ...の部分が、FileStreamを、常により多くのサニタイズパスを望んでいる(ウィット:私はこれはurl.AbsoluteStringがファイルを返すためと考えられる

"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" 

の線に沿って例外何かを得ます時間例えばスペースに置き換え%の20代を)私はそれが「ファイルを削除し、url.AbsoluteStringを取るのは非常にハック方法で動作するようになった最終的にはアプリケーションのバンドルディレクトリ

/private/var/mobile/Applications/A7B5E435-F7D1-4985-BA97-C243E63EFC39/MyApp.app/ 

でなければならないものに比べ:/// "の部分に、../../../などの束を追加し、"%20 "を" "に置き換えます。

public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation) 
     { 
      string fname = "../../../../../../../../../" + (url.AbsoluteString).Replace("%20", " ").Replace("file:///",""); 
      Stream bob = new FileStream(fname, FileMode.Open, FileAccess.Read); 
      return true; 
     } 

これはうまくいきましたが、ひどくハックしたようです。では、Xamarinを使用して、ファイルを指すNSURLから読みやすいファイルストリームを取得する正しい方法は何ですか?

あなたはファイルパスを取得することができます

+0

'NSUrl'の源は何ですか?これはファイルピッカーから来ますか?私はちょうど最近非常に類似した動作を実装しました。 – matthewrdev

答えて

2

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 

参考:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/index.html#//apple_ref/occ/instp/NSURL/path

+0

ありがとう、これは私の質問の一部に答えるが、新しいFileStream()は、質問に記載されているようにいくつかのランダムなパスへの相対パスを期待するという事実は役に立ちません – matt

2

(これは、IOS 7にあった注意し、IOS 9で、渡されたパスは、多くの点で、あまりにもディレクトリツリーで高いレベルでのFileStreamのデフォルトのディレクトリに異なっています) Pathプロパティを通じてNSUrlの成分:

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

これは絶対ファイルパスを返すと空間に%20をデコードします。

関連する問題