web-dev-qa-db-ja.com

NSURLパスとabsoluteString

NSURLNSStringの間の変換に関するSO)に関する多くの質問を見てきました。それらはすべて、いずれかのNSString *path = [myURL absoluteString];またはNSString *path = [myURL path];これらの方法の実際の違いは何ですか?一方を他方に対して使用する必要があるときはありますか?Apple Docs を調べてみましたが、役に立たないことがわかりました。

私はURLがWebサイトに関する議論や異なるマシン間で情報を送信することに関する他のトピックでのみ言及されていることに慣れており、単一のマシン上のファイル構造だけを扱うときは決して言及されません。おそらく、これが私の混乱の原因です。なぜなら、ファイルがネットワーク上にあるかローカルデバイス上にあるかに関わらず、NSURLがファイルにアクセスする好ましい方法であるようだからです。または、それはまったく無関係なトピックかもしれません。わからない。

58
GeneralMike

質問1:

これらの方法の実際の違いは何ですか?

6行のコード(3行はローカル、3行はhttp URL)を記述し、少し遊んでみましょう。

file://スキームを使用してNSURLを作成しましょう。 /の後に3 file:がある理由を自問する場合、スキームの完全なURL(file://および絶対パスまたは相対パス)が存在することを覚えておく必要があります(URLの作成に関する詳細情報を参照できます) in RFC 1808ページ )。/で始まる絶対パスを使用するため、最終的に///になります。

NSURL *aLocalURL = [NSURL URLWithString:@"file:///Users/dennis/Desktop/"];
NSLog(@"absolute string: %@", aLocalURL.absoluteString);
NSLog(@"path: %@", aLocalURL.path);

出力:

絶対文字列:file:/// Users/dennis/Desktop /
パス:/ Users/dennis/Desktop

したがって、absoluteStringにはまだそのスキームがありますが、pathにはこの情報がありません。

注:pathはファイル(ディレクトリ)URLであり、 docs 状態であるため、末尾のスラッシュは削除されます。


次に、リモートURLを見てみましょう。これらのタイプのURLを使用すると、ほとんどの人はより馴染みのあるものになります。ローカルURLと同じ手順を使用して作成します。スキームはhttp://になり、pathwww.Apple.com/になります。

NSURL *anHTTPURL = [NSURL URLWithString:@"http://www.Apple.com/"];  
NSLog(@"absolute string: %@", anHTTPURL.absoluteString);
NSLog(@"path: %@", anHTTPURL.path);

出力:

絶対文字列: http://www.Apple.com/
パス:/

繰り返しますが、絶対文字列はまだそのスキームを知っていますが、path/になりました。したがって、pathは、リモートURLで作業する場合の適切な方法ではないようです。

ただし、http://www.Apple.com/index.htmlのようなURLがある場合、

絶対文字列: http://www.Apple.com/index.html
パス:/index.html

ここでドキュメントを読むことも役立ちます:

RFC 3986により、権限(ホスト名とポート)部分の後の先頭のスラッシュはパスの一部として扱われます。

したがって、pathは、authorityの後のスラッシュで始まる(および含む)すべてであり、この場合はwww.Apple.comです。


質問2

一方を他方に対して使用する必要がある場合はありますか?

docs から:(メソッド:path

このURLオブジェクトにファイルURL(isFileURLで決定)が含まれている場合、このメソッドの戻り値はNSFileManagerまたはNSPathUtilitiesのメソッドへの入力に適しています。

私の意見では、文はpathまたはNSFileManagerを使用するときはNSPathUtilitiesを使用する必要があることをclearlyと述べています。


結論:

リモートURLを使用する場合、(一般的に)absoluteStringを使用します。そうしないと、結果は(一般的に)望んだものではありません。
ローカルURLを使用する場合は、pathを使用します。

ソース:
http://www.ietf.org/rfc/rfc1808.txt
http://www.ietf.org/rfc/rfc3986.txt
NSURLクラスリファレンス

133
HAS

HASの応答への追加-Appleのドキュメントでは、パスベースのURLはいくつかの点でよりシンプルであると述べていますが、ファイル参照URLには、ファイルが移動または名前変更されても参照が有効なままであるという利点がありますアプリの実行中。

「ファイルとディレクトリへのアクセス」のドキュメントから:

「パスベースのURLは操作が簡単で、デバッグが簡単で、NSFileManagerなどのクラスで一般的に好まれます。ファイル参照URLの利点は、アプリの実行中にパスベースのURLよりも壊れにくいことです。 Finderでファイルを移動すると、そのファイルを参照するパスベースのURLはすぐに無効になり、新しいパスに更新する必要がありますが、ファイルが同じディスク上の別の場所に移動する限り、その一意のIDは変更してもファイル参照URLはすべて有効です。」

https://developer.Apple.com/library/content/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html

0
dougzilla