iOSアプリのフォルダ検索方法について解説します。
iOSアプリのファイルシステムについては、【Swift】アプリ内のファイル読み書きで解説していますので、あわせてそちらも御覧ください。
環境
この記事の情報は次のバージョンで動作確認しています。
【Xcode】12.4
【Swift】5.3.2
【iOS】14.4
【macOS】Big Sur バージョン 11.1
【Swift】5.3.2
【iOS】14.4
【macOS】Big Sur バージョン 11.1
パスとURL
URLはリモートサーバー上のアイテムやローカルファイルへのパスなど、リソースの場所を識別する構造体です。
例えば、iPhoneの実機でホームディレクトリのパスは、次のような文字列ですが、
1 2 3 |
/var/mobile/Containers/Data/Application/BF37503F-3612-4E33-99C2-5DD06206FC08/ |
これをURL形式にすると、ローカルファイルを示す"file://"が、先頭に付加されます。
1 2 3 |
file:///var/mobile/Containers/Data/Application/BF37503F-3612-4E33-99C2-5DD06206FC08/ |
Appleではローカルファイルを参照する際にも、このURLの使用を推奨しています。
URL構造体のイニシャライザとプロパティ
URL(fileURLWithPath: パス)
引数で指定したローカルファイルパスまたはディレクトリを参照するURLを生成します。
次のように使うと、アプリケーションのホームディレクトリURLが取得できます。
1 2 3 |
URL(fileURLWithPath: NSHomeDirectory()) |
.path
URLからパス(String)を返すプロパティです。
.lastPathComponent
URLの最後のパスコンポーネントを返す、パスが空文字の時は空文字を返します
.hasDirectoryPath
URLがディレクトリを表す場合にtrueを返します。
.isFileURL
URLがファイルを表す場合にtrueを返します。
フォルダの検索
フォルダの検索はFileManagerクラスのメソッドcontentsOfDirectory()を使います。
引数atで指定したフォルダURL直下にあるアイテムのURLリストを返します。
1 2 3 |
FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: nil) |
このメソッドは失敗した場合エラーを返すので、try catchによるエラーハンドリングが必要です。
使用例
アプリケーションのホームディレクトリ配下を検索するサンプルアプリです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
import SwiftUI struct ContentView: View { var body: some View { NavigationView { List { ForEach(getFolder(URL(fileURLWithPath: NSHomeDirectory())), id: \.self) { url in ItemCell(url:url) } } .navigationTitle("フォルダ検索") } } } /// アイテムセル表示View /// URLで指定された1アイテムを表示する /// フォルダの場合はサブフォルダへのリンク、その他の場合はファイル名を表示 struct ItemCell: View { let url: URL var body: some View { HStack { if url.hasDirectoryPath { /// フォルダ NavigationLink(destination: SubFolder(url: url)) { Image(systemName: "folder") Text(url.lastPathComponent + "/") } } else { /// ファイル Image(systemName: "doc.text") Text(url.lastPathComponent) } } } } /// サブフォルダ表示View struct SubFolder: View { let url: URL var body: some View { List { ForEach(getFolder(url), id: \.self) { url in ItemCell(url:url) } } } } /// フォルダ取得 /// - Parameter url: 情報を取得するフォルダのURL /// - Returns: 指定されたフォルダに含まれるアイテムのURLリストを返す func getFolder(_ url: URL) -> [URL] { do { /// フォルダのURLからふくまれるURLを取得 var fileAndFolderURLs = try FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: nil) /// ファイル名でソート fileAndFolderURLs.sort(by: {$0.lastPathComponent < $1.lastPathComponent}) return fileAndFolderURLs } catch { print(error) return [] } } |
あわせて読みたい記事
【Swift】アプリ内のファイル読み書き
(2022/01/18 更新) アプリ内のファイル読み書き方法を解説します。