Aliasverfolgung mit Carbon
-
Ich möchte den Zielpfad einer Aliasdatei herausfinden. Was äquivalentes zu readlink gibt's offenbar nicht, ich bin jetzt inzwischen hierbei angelangt:
std::string followAlias(const std::string& fileName) { char pathName[MAX_PATH]; strncpy(pathName,fileName.c_str(),MAX_PATH); CFStringRef cfStringRef=CFStringCreateWithCString(kCFAllocatorDefault,fileName.c_str(),kCFStringEncodingUTF8); CFURLRef urlRef=CFURLCreateWithFileSystemPath(NULL,cfStringRef,kCFURLPOSIXPathStyle,false); std::runtime_error error("Zugriff oder Alias-Verfolgung für "+extractFileName(fileName)+" fehlgeschlagen."); if (!urlRef)throw error; FSRef targetFolderFSRef; bool gotFSRef=CFURLGetFSRef(urlRef,&targetFolderFSRef); CFRelease(urlRef); if (!gotFSRef)throw error; if (FSResolveAliasFile(&targetFolderFSRef,true,NULL,NULL)!=0)throw error; if (FSRefMakePath(&targetFolderFSRef,(UInt8*)pathName,MAX_PATH)<0)throw error; return pathName; }
CFURLGetFSRef gibt aber false zurück. Die Testdatei liegt auf einer AFP-Freigabe, falls das relevant ist. Was klappt hier nicht?
-
CFURLGetFSRef hat überhaupt nicht false zurückgegeben, gdb hat nur konsistent Mist angezeigt. Da g++ sich ständig beim Kompilieren mit -g mit einem ICE verabschiedet, hätte es mich nicht wundern sollen.
FSResolveAliasFile verträgt es lediglich nicht, wenn man bei den letzten beiden Ausgabeparametern NULL übergibt.