FSSimpleCreateFile (Cocoa)

| コメント(0)
普段は、標準ライブラリ使えばいいんですが、ファイルタイプの指定はまだ必要なので、こんな感じに成ります。
POSIX パス (UTF8) から、FSRef への変換は、FSPathMakeRef 使います。

OSErr FSSimpleCreateFile(FSRef *pfsref, const char* fname, OSType creator,
OSType fileType) {
	OSErr		error = bdNamErr;
	UniChar		utfname[256];
	UniCharCount	utfsize;
	FSRef		tmpRef;
	CFStringRef	cfname;
	FSCatalogInfo	catinfo;
	FileInfo*	fileinfo;
	
	cfname = CFStringCreateWithCString(NULL, fname, kCFStringEncodingUTF8);
	utfsize = (UniCharCount)CFStringGetLength(cfname);
	
	if (utfsize) {
		CFStringGetCharacters(cfname, CFRangeMake(0, utfsize), utfname);
		if (!FSMakeFSRefUnicode(pfsref, utfsize, utfname, 
kTextEncodingUnicodeDefault, &tmpRef))
			FSDeleteObject(&tmpRef);
		
		fileinfo = (FileInfo*)catinfo.finderInfo;
		fileinfo->fileCreator = creator;
		fileinfo->fileType = fileType;
		fileinfo->finderFlags = 0;
		fileinfo->location.h = 0;
		fileinfo->location.v = 0;
		fileinfo->reservedField = 0;
		
		error = FSCreateFileUnicode(pfsref, utfsize, utfname, 
kFSCatInfoFinderInfo, &catinfo, &tmpRef, NULL);
	}
	CFRelease(cfname);
	return error;
}

ちなみにファイルの一覧を取得するのは、FSOpenIterator と、FSGetCatalogInfoBulk を使うのですが、FSRef 自体がデータ構造が公開されておりませんし、ファイル名も保持していませんので、結局、POSIX パスに変換して、保存してしまいます。
POSIX パスの場合は、ディレクトリー名が変更された場合等に対応出来ないのですが、その為に FSGetCatalogInfo 等で、FSSpec を取得するのも後ろ向きな気がしませんか?
以前はそれで問題が出る (MS Word とか) 事もあったのですが、最近はそれが普通なので、もう特に気にしなくても良い気がします。(^^;;

POSIX パスで管理する場合は、opendir を使ってファイル一覧を作成した方が楽ですね。

コメントする