HMDT - Logic and Intuition -

about HMDT

Cocoa Programming Tips 1001

Foundation

NSFileManager

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

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

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

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

back to top content

Copyright © 2002-2006 HMDT. All rights reserved.