ディレクトリをトラバースしてファイル情報を得る

ディレクトリをトラバースしてファイル情報を得る

特定のディレクトリ下のファイル情報をサブディレクトリも含めて取得する。
ディレクトリは階層構造であり、その深さは任意である。特定のディレクトリの下にあるファイルの情報を、サブディレクトリも含めて全て取得するには、関数の再帰呼び出し(リカーシブコール)を利用する。このようにディレクトリ構造を再帰的に追い求めることをトラバースするということがある。

ファイルパス名の取得

以下のC関数は、特定のディレクトリの下の全ファイルのフルパス名をNSArrayオブジェクトの配列にして返すものである。 なお、ディレクトリの操作のためにCライブラリ<sys/dirent.h>をインクルードする。
ディレクトリ名を引数に取り、そのディレクトリの下にあるファイルのパス名を取得する。ディレクトリの下にサブディレクトリがあればそのサブディレクトリを引数にして自分自身を再び呼び出しパス名を取得する処理を繰り返す。ディレクトリの深さだけ関数が再帰的に呼び出される。
関数 traverse は、Objective-Cの実装ファイル(.m)に記述すれば、Foundationフレームワークの中で動くので、Objective-Cのクラスを使用することができる。
Swift版 実行例
[参考]ファイル情報を取得する<sys/stat.h>
本例では使用していないが、Cライブラリを利用すればinode関連のファイル情報を得ることができる。 次の例はファイルサイズを求めている。

ファイルタイプの判定

たとえば、テキストファイルを読み込みキーワードによる全文検索を行うといった、特定のタイプのファイルに対して特定の操作を行うときには、取得したファイルパス名からファイルのタイプを判定することが求められる。
ファイルタイプは、ファイルのパス名またはURLから取得できる Uniform Type Identifier(UTI)から求めることができる。 ファイルタイプを判定するには、UTTypeConformsTo関数を使用する。
Objective-C版
Swift版

判定の仕組みがよくわからない

拡張子.txtのを持つテキストファイルから拡張子を削ってもテキストファイルとして認識される。ただし拡張子を.jpgに変えると認識されなくなる。そして.jpgを削るとまたテキストファイルとして認識される。ファイル本体や名前とは別にファイルタイプを保持しているところ(たぶんinodeのような)があり、リネームタイミングで更新しているのだろう。