我如何使已弃用的 FSPathMakeRef、FSIsAliasFile、FSResolveAliasFileWithMountFlags、FSRefMakePath 现代化
Posted
技术标签:
【中文标题】我如何使已弃用的 FSPathMakeRef、FSIsAliasFile、FSResolveAliasFileWithMountFlags、FSRefMakePath 现代化【英文标题】:How i can modernize deprecated FSPathMakeRef, FSIsAliasFile, FSResolveAliasFileWithMountFlags, FSRefMakePath 【发布时间】:2014-07-21 16:41:57 【问题描述】:我需要帮助以保持沉默已弃用:FSPathMakeRef
、FSIsAliasFile
、
FSResolveAliasFileWithMountFlags
, 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】:现代方法是使用NSURL
s 来表示文件位置。因此,您将不得不替换 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 现代化的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用已弃用的类的情况下编写 Hadoop map reduce 作业?