NSFileManager

NSFileManager

ディレクトリの中身を調べる 3 つの方法

Keywords: directoryContentsAtPath, enumeratorAtPath, subpathsAtPath

あるディレクトリがあったとして、その中にどんなファイルやディレクトリがあるか、調べたいとしよう。いくつかの方法が考えられるけど、NSFileManager は 3 つの方法を提供してるんだ。directoryContetnsAtPath: と enumeratorAtPath: と subpathsAtPath: だ。

Foundation/NSFileManager.h

- (NSArray *)directoryContentsAtPath:(NSString *)path;
- (NSDirectoryEnumerator *)enumeratorAtPath:(NSString *)path;
- (NSArray *)subpathsAtPath:(NSString *)path;

この 3 つは、ディレクトリの中身を調べる、っていうおおまかな目的はいっしょなんだけど、それぞれ微妙に違う。実際に挙動を調べてみよう。サンプルとして、下のようなディレクトリの中を探索してみよう。

いくつかのファイルと、サブディレクトリがあるところがポイントだ。

dirTest.gif




Foundation - NSFileManager

ディレクトリの中身を調べる その 1

Keywords: directoryContentsAtPath
directoryContentsAtPath: を使うと、ディレクトリの中身を、NSString の配列で取得することができるんだ。

Foundation/NSFileManager.h

- (NSArray *)directoryContentsAtPath:(NSString *)path;

引数 path にディレクトリのパスを渡してやれば、そのディレクトリの中身が返ってくるぜ!ただし、気をつけて欲しいのは、サブディレクトリの中身までは探らないんだ。サブディレクトリも見たいときは、subpathsAtPath: を使ってくれ。

じゃ、directoryContentsAtPath: を使って見よう。こんな感じだ。

dirTest.m (sample)

- (IBAction)openFolder:(id)sender
{
 int result;
 NSOpenPanel* openPanel;
 NSArray* dirArray;

 openPanel = [NSOpenPanel openPanel];
 [openPanel setCanChooseDirectories:YES];
 result = [openPanel runModalForDirectory:NSHomeDirectory()
    file:nil
    types:nil];
 if(result == NSOKButton) {
  NSString*
dirPath = [openPanel filename];
  dirArray = [[NSFileManager defaultManager]
    directoryContentsAtPath:dirPath];
  NSLog([dirArray description]);
 }
}

実行するとオープンダイアログが出て、ディレクトリを指定すると、中身を表示する。サンプルのディレクトリを選んでみると、結果はこんな感じ。

(result)

(
 EMMYLOU,
 Michelangelo.txt,
pearl.txt,
 "Red Dirt Girl.txt",
 tragedy.txt
)

ディレクトリの名前も含まれてるけど、サブディレクトリは含まれないとこがポイントね。




Foundation - NSFileManager

ディレクトリの中身を調べる その 2

Keywords: subpathsAtPath
続いては subpathsAtPath:。これは directoryContentsAtPath: と似てるんだけど、結果にサブディレクトリの中身も含まれるんだ。

Foundation/NSFileManager.h

- (NSArray *)subpathsAtPath:(NSString *)path;

directoryContentsAtPath: と同じように、引数 path にディレクトリのパスを渡してやれば、そのディレクトリの中身が返ってくる。しかもサブディレクトリの中身付きだ。

サンプルはこんな感じだ。

dirTest.m (sample)

- (IBAction)openFolder:(id)sender
{
 int result;
 NSOpenPanel* openPanel;
 NSArray* dirArray;

 openPanel = [NSOpenPanel openPanel];
 [openPanel setCanChooseDirectories:YES];
 result = [openPanel runModalForDirectory:NSHomeDirectory()
    file:nil
    types:nil];
 if(result == NSOKButton) {
  NSString*
dirPath = [openPanel filename];
  dirArray = [[NSFileManager defaultManager]
    subpathsAtPath:dirPath];
  NSLog([dirArray description]);
 }
}

実行するとオープンダイアログが出て、ディレクトリを指定すると、中身を表示する。サンプルのディレクトリを選んでみると、結果はこんな感じ。

(result)

(
 EMMYLOU,
 EMMYLOU/Ethan.txt,
 EMMYLOU/Malcolm.txt,
 Michelangelo.txt,
 pearl.txt,
 "Red Dirt Girl.txt",
 tragedy.txt
)

ディレクトリの名前と、サブディレクトリの中身も含まれる。サブディレクトリは、指定したディレクトリからの相対パスで示されるぜ。




Foundation - NSFileManager

ディレクトリの中身を調べる その 3

Keywords: enumeratorAtPath
3 つ目は enumeratorAtPath:。これを使うと、ディレクトリの中身を enumerator で取り出すことができる。サブディレクトリの中身も取れるぜ。

Foundation/NSFileManager.h

- (NSDirectoryEnumerator *)enumeratorAtPath:(NSString *)path;

サンプルはこんな感じだ。

dirTest.m (sample)

- (IBAction)openFolder:(id)sender
{
 int result;
 NSOpenPanel* openPanel;
 NSArray* dirArray;

 openPanel = [NSOpenPanel openPanel];
 [openPanel setCanChooseDirectories:YES];
 result = [openPanel runModalForDirectory:NSHomeDirectory()
    file:nil
    types:nil];
 if(result == NSOKButton) {
  NSString* dirPath = [openPanel filename];
  NSString* file;
  NSDirectoryEnumerator* dirEnum;
  dirEnum = [[NSFileManager defaultManager]
    enumeratorAtPath:dirPath];
  while(file = [dirEnum nextObject]) {
    NSLog(file);
  }
 }
}

サンプルのディレクトリを選んだときの実行結果はこんな感じだ。

(result)

EMMYLOU
EMMYLOU/Ethan.txt
EMMYLOU/Malcolm.txt
Michelangelo.txt
pearl.txt
Red Dirt Girl.txt
tragedy.txt

一個ずづ、順繰りに取り出してるよ。サブディレクトリは、指定したディレクトリからの相対パスで示されるぜ。