当我移动文件时,一些 MacOSX 应用程序(如 iTunes)并没有真正的问题——它们仍然很容易找到移动的文件(而且我很确定它们以前没有打开过该文件)。
他们是怎么做到的?我能想到的一种可能性是 FS 事件通知系统。(相关问题)
但我记得我看过一些绝对文件句柄/id 左右,我想也许他们总是可以通过该文件句柄查询当前文件名。有没有类似的东西?也许是inode nr,但这有点太少了,因为我不确定如何从inode nr 获取文件名以及如何打开文件。
当我移动文件时,一些 MacOSX 应用程序(如 iTunes)并没有真正的问题——它们仍然很容易找到移动的文件(而且我很确定它们以前没有打开过该文件)。
他们是怎么做到的?我能想到的一种可能性是 FS 事件通知系统。(相关问题)
但我记得我看过一些绝对文件句柄/id 左右,我想也许他们总是可以通过该文件句柄查询当前文件名。有没有类似的东西?也许是inode nr,但这有点太少了,因为我不确定如何从inode nr 获取文件名以及如何打开文件。
正如 Albert 提到的 Alias Manager 已被折旧,替换的是URL Bookmark方法
我认为您正在寻找的是NSURL
的书签 - 由于 Apple 的短视网页设计,我在 iPad 上无法生成正确的链接,但其本质是您从 URL 获取书签并随后可以解析返回到 URL 的书签。系统会在此期间解决文件中的任何移动。
我刚刚发现了Alias Manager,这听起来像是我正在寻找的东西。不幸的是,这似乎已被弃用。(相关问题)关于弃用的一些信息。
Python代码:
import AppKit
def getFileNativeId(filepath):
if not os.path.isfile(filepath): return None
filepath = os.path.abspath(filepath)
filepath = unicode(filepath)
url = AppKit.NSURL.alloc().initFileURLWithPath_(filepath)
bookmark = url.bookmarkDataWithOptions_includingResourceValuesForKeys_relativeToURL_error_(AppKit.NSURLBookmarkCreationPreferFileIDResolution,None,None,None)
bytes = bookmark[0].bytes().tobytes()
return bytes
def getPathByNativeId(fileid):
nsdata = AppKit.NSData.alloc().initWithBytes_length_(fileid, len(fileid))
url, _, _ = AppKit.NSURL.URLByResolvingBookmarkData_options_relativeToURL_bookmarkDataIsStale_error_(nsdata, AppKit.NSURLBookmarkResolutionWithoutUI, None,None,None)
if not url: return None
return unicode(url.path())