|
- Foundation-
NSDictionary
Foundation - NSDictionary
ディレクトリの中身を調べる 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 つは、ディレクトリの中身を調べる、っていうおおまかな目的はいっしょなんだけど、それぞれ微妙に違う。実際に挙動を調べてみよう。サンプルとして、右のようなディレクトリの中を探索してみよう。
いくつかのファイルと、サブディレクトリがあるところがポイントだ。
Foundation - NSDictionary
ディレクトリの中身を調べる その 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 - NSDictionary
ディレクトリの中身を調べる その 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 - NSDictionary
ディレクトリの中身を調べる その 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
一個ずづ、順繰りに取り出してるよ。サブディレクトリは、指定したディレクトリからの相対パスで示されるぜ。
|