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

Posted

技术标签:

【中文标题】我如何使已弃用的 FSPathMakeRef、FSIsAliasFile、FSResolveAliasFileWithMountFlags、FSRefMakePath 现代化【英文标题】:How i can modernize deprecated FSPathMakeRef, FSIsAliasFile, FSResolveAliasFileWithMountFlags, FSRefMakePath 【发布时间】:2014-07-21 16:41:57 【问题描述】:

我需要帮助以保持沉默已弃用:FSPathMakeRefFSIsAliasFileFSResolveAliasFileWithMountFlags, FSRefMakePath. 任何帮助将不胜感激。

// 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);

【问题讨论】:

【参考方案1】:

现代方法是使用NSURLs 来表示文件位置。因此,您将不得不替换 FSRef 的所有用途。 (也就是说,如果您希望将 FSPathMakeRef() 替换为同样为您提供 FSRef 的不同函数,您将会失望。)

因此,您可以使用+[NSURL fileURLWithPath:]+alloc 加上-[NSURL initFileURLWithPath:],而不是FSPathMakeRef()

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

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

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

【讨论】:

谢谢肯!!!我将根据您的方法修改代码。如果我遇到问题,我希望能得到您的帮助。特别感谢您的快速响应。 问题是FSIsAliasFile() 比typeOfFile:error:] plus 快3.7 @Leonardo,你可以试试-[NSURL getResourceValue:forKey:error: ]NSURLIsAliasFileKey。这可能比 UTI 方法更快。另外,您这样做的频率是否很高,以至于速度很重要? 谢谢。但是 NSURLIsAliasFileKey 对别名和符号链接都返回 YES。甚至 FSIsAliasFile 也会为别名和符号链接返回 YES。我知道为别名获取 YES 而为 symLink 获取 NO 的唯一方法是使用: NSString *type = [workspace typeOfFile:self error:nil]; return [type isEqualToString:@"com.apple.alias-file"];但是这种方法很慢。我正在寻找使用 lstat 的东西。有人知道吗? @Leonardo:嗯,你可以先检查NSURLIsSymbolicLinkKey,然后再检查NSURLIsAliasFileKey【参考方案2】:

问题是 FSIsAliasFile() 仍然比 3.7 快

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

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

【讨论】:

以上是关于我如何使已弃用的 FSPathMakeRef、FSIsAliasFile、FSResolveAliasFileWithMountFlags、FSRefMakePath 现代化的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何在 Android 中使用/不使用已弃用的方法

如何在不使用已弃用的类的情况下编写 Hadoop map reduce 作业?

如何更改已弃用的 beginSheetForDirectory 方法

如何安装已弃用的 uws 版本

在 Android 中,如何删除已弃用的通知变量?

我该如何调整这个已弃用的 StratifiedKFold 代码