Geometry 関数
NSBundle
NSDictionary
-ディレクトリの中身を調べる 3 つの方法
-ディレクトリの中身を調べる その 1
-ディレクトリの中身を調べる その 2
-ディレクトリの中身を調べる その 3
NSFileManager
NSMutableAttributedString
NSNumber
NSScanner
NSString
NSTimer
Graphic 関数
NSApplication
NSBezierPath
NSCell
NSColor
NSCursor
NSCustomImageRep
NSDocument
NSDocumentController
NSDragging
NSEvent
NSFontManager
NSGraphicsContext
NSImage
NSMenu
NSOutlineView
NSPanel
NSPopUpButton
NSResponder
NSScrollView
NSString 追加
NSTableColumn
NSTableView
NSTextStorage
NSTextView
NSToolbar
NSView
NSWindow
NSWorkspace
その他
.nib ウィンドウ
Views パレット
クラス
インスタンス変数
メソッド
CFXML
Carbon Event
Carbon Graphics
Cocoa で日本語
メソッド
その他

- 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

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



[Home] [Download] [Archives] [BBS] [Cocoa Programming Tips 1001] [Core Foundation の秘密] [Safari Developer Center] [はじめてのブラウザのつくり方] [Sketch BP] [スクリーンセイバーを作ろう] [Objective-C 最適化] [Authorization API 完全理解] [Mac OS X Programming Books Review] [オブジェクト指向の言語比較論] [panther-dev]

mailto: mkino@xd5.so-net.ne.jp