我在解析Mac上的别名链接时遇到问题。我正在检查文件是否是别名,然后我想接收原始路径。相反,我只得到一个文件ID。安莉的想法?
func isFinderAlias(path:String) -> Bool? { var isAlias:Bool? = false // Initialize result var. // Create a CFURL instance for the given filesystem path. // This should never fail, because the existence isn't verified at this point. // Note: No need to call CFRelease(fUrl) later, because Swift auto-memory-manages CoreFoundation objects. print("path before \(path)"); let fUrl = CFURLCreateWithFileSystemPath(nil, path, CFURLPathStyle.CFURLPOSIXPathStyle, false) print("path furl \(fUrl)"); // Allocate void pointer - no need for initialization, // it will be assigned to by CFURLCopyResourcePropertyForKey() below. let ptrPropVal = UnsafeMutablePointer<Void>.alloc(1) // Call the CoreFoundation function that copies the desired information as // a CFBoolean to newly allocated memory that prt will point to on return. if CFURLCopyResourcePropertyForKey(fUrl, kCFURLIsAliasFileKey, ptrPropVal, nil) { // Extract the Bool value from the memory allocated. isAlias = UnsafePointer<CFBoolean>(ptrPropVal).memory as Bool // it will be assigned to by CFURLCopyResourcePropertyForKey() below. let ptrDarwin = UnsafeMutablePointer<DarwinBoolean>.alloc(1) if ((isAlias) == true){ if let bookmark = CFURLCreateBookmarkDataFromFile(kCFAllocatorDefault, fUrl, nil){ let url = CFURLCreateByResolvingBookmarkData(kCFAllocatorDefault, bookmark.takeRetainedValue(), CFURLBookmarkResolutionOptions.CFBookmarkResolutionWithoutMountingMask, nil, nil, ptrDarwin, nil) print("getting the path \(url)") } } // Since the CF*() call contains the word "Copy", WE are responsible // for destroying (freeing) the memory. ptrDarwin.destroy() ptrDarwin.dealloc(1) ptrPropVal.destroy() } // Deallocate the pointer ptrPropVal.dealloc(1) return isAlias }
编辑: 两个答案都是正确的!我之所以选择mklement0的答案,是因为最初没有说明该代码必须在10.9上运行,从而使其更加灵活
这是 在OS X 10.9上也可以 使用的 实现 :
// OSX 10.9+ // Resolves a Finder alias to its full target path. // If the given path is not a Finder alias, its *own* full path is returned. // If the input path doesn't exist or any other error occurs, nil is returned. func resolveFinderAlias(path: String) -> String? { let fUrl = NSURL(fileURLWithPath: path) var targetPath:String? = nil if (fUrl.fileReferenceURL() != nil) { // item exists do { // Get information about the file alias. // If the file is not an alias files, an exception is thrown // and execution continues in the catch clause. let data = try NSURL.bookmarkDataWithContentsOfURL(fUrl) // NSURLPathKey contains the target path. let rv = NSURL.resourceValuesForKeys([ NSURLPathKey ], fromBookmarkData: data) targetPath = rv![NSURLPathKey] as! String? } catch { // We know that the input path exists, but treating it as an alias // file failed, so we assume it's not an alias file and return its // *own* full path. targetPath = fUrl.path } } return targetPath }
注意:
与vadian的解决方案不同,即使对于 非 别名文件,这也将返回一个值,即该文件 自己的 完整路径,并且将路径字符串而不是NSURL实例作为输入。
NSURL
vadian的解决方案需要适当的权利才能在沙盒应用程序/环境中使用该功能。它 似乎 ,这其中至少不需要那么 在相同的程度 ,因为它 会 在运行 Xcode的游乐场 ,不像vadian的解决方案。如果有人可以阐明这一点,请帮助。
#!/usr/bin/env swift