Carbonの新APIによる、Finder経由でのファイル削除

以前はAppleScript経由で面倒っぽかったけど、LeopardからCarbonにAPIが加わったらしい。

CarbonCore Framework Release Notes for Mac OS X v10.5

追記 @ 2009-03-23

とりあえず以下のコードで動くっぽい。要<CoreServices/CoreServices.h>。

- (BOOL)moveFileToTrash:(NSString *)filename
{
    FSRef fileRef;

    // 対象の存在をチェック
    if(![[NSFileManager defaultManager] fileExistsAtPath:filename])
        return NO;

    // FSRefの取得(ちなみにコードを拝借したCocoaDVDPlayerではUTF-8ではなくASCIIにしてた)
    //const char *cPath = [filename UTF8String];
    // 追記その2参照
    const char *cPath = [filename fileSystemRepresentation];
    OSStatus result = FSPathMakeRef ((UInt8*)cPath, &fileRef, NULL);
    if (result != noErr)
        return NO;

    // ゴミ箱に移動
    // オプションはテキトー。Finderのような効果音は別途処理を記述する必要あり
    result = FSMoveObjectToTrashSync(&fileRef, NULL,  kFSFileOperationDefaultOptions);

    return (result == noErr);
}

追記その2 @ 2009-03-28

Cocoa Study Blogの記事のコメントによると、UTF8StringではなくfileSystemRepresentationにすべきだろうとのこと。確かに、現在はUTF-8が使われてるけど、将来的には変更される可能性もあるし、こっちを使った方がいいかも。