kitoko552.memo

kitoko552のメモ

Swiftで端末のディレクトリ一覧を表示する

要点

  • NSFileManagerを使って探索する。
  • 使えるのはcontentsOfDirectoryAtPath(path: String) -> [String]?, subpathsAtPath(path: String) -> [String]?, enumeratorAtPath(path: String) -> NSDirectoryEnumerator?の3つ
  • subpathsAtPath(path: String) -> [String]?が一番シンプルかつ簡単
NSFileManager.defaultManager().subpathsAtPath("/")?.forEach {
  print($0)
}

ディレクトリの一覧を表示したい

ディレクトリの一覧を表示したいというときはほとんどないかもしれません。

ですが、実際に僕がそういう場面に遭遇したので参考までに。

一覧表示にはNSFileManagerを使います。

これ以降に書くメソッドはすべてNSFileManagerのものです。

contentsOfDirectoryAtPathを使う場合

まず、contentsOfDirectoryAtPathを使った場合を説明します。

正確に書くと、contentsOfDirectoryAtPath(path: String) -> [String]?となります。

ディレクトリの中身を調べたいと思ってググって最初に出てきたのがこいつでした。

こいつで正解なんですが、このメソッドはサブディレクトリまでは探索しません。

つまり、引数に渡したpath直下のディレクトリのみ表示します。

なので、全てのディレクトリをなめて欲しい場合は工夫が必要です(のちに出てくるメソッドを使えばそんな必要はありませんが)。

そこで僕が考えたのが以下のメソッドです。

func researchDirs(path: String = "/") {
  if let list = try? NSFileManager.defaultManager().contentsOfDirectoryAtPath(path) {
    list.forEach {
      let nextPath = path == "/" ? path + $0 : path + "/" + $0
      print(nextPath)
      researchDirs(nextPath)
    }
  }
}
        
researchDirs()

再帰的にメソッドを呼んで一覧を取得しています。

let nextPath = path == "/" ? ...のところが少々かっこ悪いですが、まあこれで一覧が取得できます。

subpathsAtPathを使えばもっと簡単

上のコードを書いてドヤっていた僕ですが、衝撃の事実を知ることになります。

それは、subpathsAtPath(path: String) -> [String]?はサブディレクトリまで探索してくれるということです。

はい。

上のメソッドはもう要りません。

こいつを使えばとてもシンプルになります。

NSFileManager.defaultManager().subpathsAtPath("/")?.forEach {
  print($0)
}

簡単!

ちなみにforEachについて知りたい方は以下をご覧ください。

blog.kitoko552.com

blog.kitoko552.com

enumeratorAtPathというのもある

参考までにですが、enumeratorAtPathというメソッドもあります。

正確に書くと、enumeratorAtPath(path: String) -> NSDirectoryEnumerator?です。

違いは見て分かる通り、返り値です。

他の二つが[String]?であったのに対して、こいつはNSDirectoryEnumerator?です。

ですが、実際に一覧を表示するコードはsubpathsAtPathと変わりません。

NSFileManager.defaultManager().enumeratorAtPath("/")?.forEach {
  print($0)
}

これでいけます。

どっちも同じなのでどっちでもいいと言えばいいんですが、返り値がStringの配列(Optionalですが)というシンプルな方がいいと思うので、subpathsAtPathを使うことをお勧めします。