68345


ファイルの一覧については、

[code]

        let documentPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].absoluteString
    guard let fileNames = try? FileManager.default.contentsOfDirectory(atPath: documentPath) else {
        return nil
    }
    
[/code]

などのように取得は可能ですが、ファイル名の一覧ではなく、同じ階層内のフォルダ名やそのフォルダのURLの取得をしたいのですがそのようなことは可能なのでしょうか。  
可能な場合、どのような方法がありますでしょうか。


CC BY-SA 4.0
2020-07-06T12:41:32.493
68341
2020-07-06T14:04:22.030
2020-07-06T13:11:10.387
14780
14780
question
swift ios
FileManager.default.contentsOfDirectoryでフォルダ内のファイルの一覧は取得できますが、同階層内のフォルダの名称取得やURLの取得は可能でしょうか


公式ドキュメントにディレクトリも取得できることが明記されています。

[`contentsOfDirectory(atPath:)`](https://developer.apple.com/documentation/foundation/filemanager/1414584-contentsofdirectory)

> Performs a shallow search of the specified directory and returns the  
>  paths of any contained items.
>
> ...
>
> ## Return Value
>
> An array of NSString objects, each of which identifies a file, **directory**
> , or symbolic link contained in path. Returns an  
>  empty array if the directory exists but has no contents.

**ファイル名は不要でフォルダ名だけ**
を、と言う場合、取得したファイル名またはフォルダ名からパスを構成して、そのパスがファイルかフォルダかをチェックすると言ったことが必要だろうと思います。

また、 **フォルダのURLの取得をしたい** と言うのであれば、

[`contentsOfDirectory(at:includingPropertiesForKeys:options:)`](https://developer.apple.com/documentation/foundation/filemanager/1413768-contentsofdirectory)

を使用した方が良いかもしれません。

こちらも、フォルダ以外を除外すると言うオプションはなかったので、得られた`URL`をチェックして、フォルダ以外を除外すると言うコードを自分で書かないといけないようです。

以下に、動作確認用の簡単なコードを示しておきます。

[code]

    import UIKit
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            //テスト用にファイルを2個、ディレクトリーを1個作ってみる
            let docUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
            FileManager.default.createFile(atPath: docUrl.appendingPathComponent("data1.dat").path, contents: nil, attributes: nil)
            FileManager.default.createFile(atPath: docUrl.appendingPathComponent("data2.dat").path, contents: nil, attributes: nil)
            do {
                try FileManager.default.createDirectory(at: docUrl.appendingPathComponent("folder1"), withIntermediateDirectories: true, attributes: nil)
            } catch {
                print(error)
            }
        }
    
        @IBAction func buttonPressed(_ sender: Any) {
            let docUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
            do {
                let filesAndFolders = try FileManager.default.contentsOfDirectory(atPath: docUrl.path)
                print(filesAndFolders) //->["data1.dat", "data2.dat", "folder1"]
                //
                let fileAndFolderURLs = try FileManager.default.contentsOfDirectory(at: docUrl, includingPropertiesForKeys: nil)
                print(fileAndFolderURLs) //->[file:///Users/.../Documents/data1.dat, file:///Users/.../Documents/data2.dat, file:///Users/.../Documents/folder1/]
                let folderURLs = fileAndFolderURLs.filter { url in
                    //`url`がファイルかフォルダか判定して、フォルダなら`true`を返す
                    var isDirectory: ObjCBool = false
                    return FileManager.default.fileExists(atPath: url.path, isDirectory: &isDirectory) && isDirectory.boolValue
                }
                print(folderURLs) //->[file:///Users/.../Documents/folder1/]
            } catch {
                print(error)
            }
        }
        
    }
    
[/code]

* * *

なお、ご質問中のコード例で`absoluteString`を使用しておられますが、そちらは`file:`スキーマを使用したURLの文字列表現`"file:///Users/.../Documents/folder1/"`なんかを取得するためのもので、ファイルアクセス用の「パス」を取得するものではありません。

ファイルURLから、ファイルパスの部分だけを取得する場合には、コード例にあるように`path`プロパティを使用して下さい。

なお、わかっておられるとは思いますが念のため記載しておくと、iOSアプリからファイルシステムの内の任意のフォルダにアクセスすることはできません。


CC BY-SA 4.0
2020-07-06T14:04:22.030
68345
2020-07-06T14:04:22.030
13972
68341
answer