我如何现代化已弃用的FSPathMakeRef,FSIsAliasFile,FSResolveAliasFileWithMountFlags,FSRefMakePath

时间:2014-07-21 16:41:58

标签: cocoa nsfilemanager macos-carbon

我需要帮助静音不推荐使用:FSPathMakeRefFSIsAliasFileFSResolveAliasFileWithMountFlagsFSRefMakePath
任何帮助将不胜感激。

// 1)弃用了FSPathMakeRef ** //

    error = FSPathMakeRef((UInt8*)[filename fileSystemRepresentation], &ref, &isFolder);
    if (error) return NO;

// 2)此处弃用了FSIsAliasFile * //

    error = FSIsAliasFile(&ref, &isAlias, &isFolder);
    if (error) return NO;

    if (isAlias)
    {
        if (isFolder) return YES;

// 3)此处弃用FSResolveAliasFileWithMountFlags * //

        error = FSResolveAliasFileWithMountFlags(&ref, true, &isFolder, &isAlias,
                                                 kARMMountVol | kARMNoUI | kARMMultVols | kARMSearch);
        if (error) return NO;
        if (isFolder) return YES;

// 4)此处弃用了CFURLCreateFromFSRef * //

        fileURL = CFURLCreateFromFSRef(kCFAllocatorDefault, &ref);
        filepath = (NSString*)CFBridgingRelease(CFURLCopyFileSystemPath(fileURL, kCFURLPOSIXPathStyle));
        CFRelease(fileURL);

2 个答案:

答案 0 :(得分:2)

现代方法是使用NSURL来表示文件位置。因此,您将不得不替换FSRef的所有用途。 (也就是说,如果您希望将FSPathMakeRef()替换为另外的FSRef函数,那么您会感到失望。)

因此,您使用FSPathMakeRef()+[NSURL fileURLWithPath:]+alloc代替-[NSURL initFileURLWithPath:]

要替换FSIsAliasFile(),您可以使用-[NSWorkspace typeOfFile:error:]获取该类型,然后使用-[NSWorkspace type:conformsToType:]kUTTypeAliasFile进行核对。

要替换FSResolveAliasFileWithMountFlags(),请使用NSURL的“书签数据”功能。首先使用+bookmarkDataWithContentsOfURL:error:从文件中获取书签数据,然后使用+URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:解析它。

您不需要替换CFURLCreateFromFSRef(),因为您已经拥有NSURL

答案 1 :(得分:0)

问题是FSIsAliasFile()仍然比

快3.7
NSString    *type = [workspace typeOfFile:filePath error:nil];
return [type isEqualToString:@"com.apple.alias-file"];

我也是,我想替换过时的FSIsAliasFile()API,但要扫描数百万个文件,这将是一个痛苦。你知道更快的方式吗?