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.


Anmelden zum Antworten