2017年11月3日金曜日

ファイルPathとファイルURL

ファイルを保存したり、ファイルの有無を確認したりするのに、ファイルPathを用いる方法と、ファイルURLを用いる方法があり、結構混乱するのでまとめ。

ファイルPathとファイルURLの違い

ファイルPath

/var/mobile/Containers/Data/Application/97C2495D-1A6B-4E5D-BCAE-39C64563328A/Documents/ファイル名

ファイルURL

file:///var/mobile/Containers/Data/Application/97C2495D-1A6B-4E5D-BCAE-39C64563328A/Documents/ファイル名

以上のように、頭に「file://」が付いてる方がURL。
WebのURLの頭に「http://」が付いてるのと一緒だな。

Documentディレクトリを得る

Path(String型)で得る

let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)last!
【結果】
/var/mobile/Containers/Data/Application/97C2495D-1A6B-4E5D-BCAE-39C64563328A/Documents

URL型で得る

let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last!

【結果】
file:///var/mobile/Containers/Data/Application/97C2495D-1A6B-4E5D-BCAE-39C64563328A/Documents

Documentsディレクトリにファイル名を追加

URLの場合はそのまま追加できる

let fileURL = documentsURL.appendingPathComponent(fileName)

Pathの場合は一度URLに変換しないといけない

let fileURL = URL(fileURLWithPath: documentsPath).appendingPathComponent(fileName)

SwiftにはPathにファイル名などを追加するメソッドがない。(たしかObjective-Cにはあった)
そのため一度URL化する必要がある。めんどくせえ。

URLからPathに変換

let filePath = fileURL.path

URLのpathプロパティで得られる。

PathからURLに変換

let url = URL(fileURLWithPath: filePath)


引数のfilePathがPathと判断されない場合(例えばファイル名の文字列とか、空白文字とか)、
123456.jpg -- file:///
という、末尾に -- file:///が付いた変な形式に変換されてエラーの原因になるので注意が必要。
その場合は
let urlStr = URL(string: "123456.jpg")
とやるといい。

0 件のコメント:

コメントを投稿