40387


### 環境

swift3  
Xcode9.0.1

### 実現したいこと

アプリ内で保存したファイルの一覧を取得したい。

### 例

下記のディレクトリにアプリ内で"test1.txt" "test2.text"というファイルを作成し保存します

[code]

    documentDirectoryFileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last
    
[/code]

その後、上記のディレクトリ内のファイルの一覧を  
test1.txt  
test2.txt  
のように表示したいです。


CC BY-SA 3.0
2017-12-19T09:16:52.647
40381
2017-12-19T11:29:40.683
2020-06-17T08:14:45.997
-1
26123
question
swift ios xcode
アプリ内で保存したファイルの一覧を取得したい


`FileManager.default.contentsOfDirectory` で一覧がとれます。

[code]

    let path = NSSearchPathForDirectoriesInDomains(.documentDirectory,Foundation.FileManager.SearchPathDomainMask.userDomainMask, true)[0]
    let items = try! FileManager.default.contentsOfDirectory(atPath: "\(path)")
    
[/code]

itemsにfile nameの配列が返される。エラー時の処理は、省いています。


CC BY-SA 3.0
2017-12-19T11:05:10.973
40385
2017-12-19T11:18:03.253
2017-12-19T11:18:03.253
22793
22793
40381
answer


基本的にはyyzさんの回答と同じことなのですが、最近のApple製APIのトレンドではファイル処理の場合でもパス(`String`)ではなく`URL`を渡すというのが主流なので、そちらの書き方をご紹介しておきます。

[code]

        let documentDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
        do {
            let contentUrls = try FileManager.default.contentsOfDirectory(at: documentDirectoryURL, includingPropertiesForKeys: nil)
            let files = contentUrls.map{$0.lastPathComponent}
            print(files) //-> ["test1.txt", "test2.txt"]
        } catch {
            print(error)
        }
    
[/code]

上記の例だと`files`は、フルパスではなく、ファイル名部分(拡張子は含む)の配列になります。

* * *

何点か補足。

  * ファイル関係の操作が必要になったら、まずは[`FileManager`クラス](https://developer.apple.com/documentation/foundation/filemanager)に適当なメソッドが無いか探しましょう。

  * 1行目で`.last`ではなく`[0]`としているのは、非Optionalな結果を得るためです。

  * `lastPathComponent`というのはURL内のパスの最後の要素(ファイルパスの場合、ファイル名部分)を返すプロパティです。Swiftの場合、パス操作用のプロパティやメソッドが`String`型に移入されないので、`URL`で扱える場合はパスよりも`URL`を使った方が便利になることが多いです。


CC BY-SA 3.0
2017-12-19T11:29:40.683
40387
2017-12-19T11:29:40.683
13972
40381
answer