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が使われてるけど、将来的には変更される可能性もあるし、こっちを使った方がいいかも。