简单介绍一下背景。我是一名长期的 Windows、C# 开发人员,为了我雇主的一个新项目,我不得不转换到 OSX 并开始学习 iOS 开发。换句话说,我对 Mac/OSX 环境还很陌生。
今天早些时候,我决定关闭 XCode,重新组织我的测试和学习项目,以及我在 XCode 中创建的包含我最有可能需要重复使用的资产的项目。当我重新启动 XCode 时,我惊讶地发现我的所有最近项目仍然在“最近”列表中,并且它们指向新的文件位置!太棒了!
XCode 如何知道我的项目位于何处?这是操作系统或文件系统的功能,还是 XCode 内置了某种智能功能来检测此类问题?
答案1
几乎每个应用程序都具有此功能文件»打开最近菜单由中的便捷方法提供(这也是存储此信息的文件LaunchServices/LSSharedFilesList.h
的名称,例如)。plist
~/Library/Preferences/com.apple.Preview.LSSharedFilesList.plist
这些条目包含序列化NSData
(大概),您可以将其复制并写入文件,例如使用十六进制编辑器。它们包含文件的完整路径、文件所在的卷名、UUID 以及一些我目前无法理解的其他信息。我假设 UUID 用于在需要时解析文件引用。
NSURL
s 可以转换为文件引用即使文件已经移动,这个问题也可以稍后解决。这个答案StackOverflow 上有更多技术信息。
我不确定,但是 HFS+ 有索引节点唯一地标识一个文件。NSURL 功能可能在此基础上实现。可观察到的行为似乎表明了这一点:如果你将文件移动到不同的文件系统,它将从打开最近文件列表,可能是因为它无法再解析。
答案2
我不知道 XCode 是如何做到这一点的,但这是一个通用的答案。
除了路径之外,文件系统对象还可以有其他标识符,例如索引节点号在 Unix 文件系统上或对象 ID在 Windows NTFS 上,它通常可用于查找具有已知 ID 的文件的所有路径。只要对象本身仍在同一文件系统中,此标识符或编号就始终保持不变,无论您将其移动到哪个目录。
对象还具有其他更明显但不太可靠的元数据,例如名称、创建日期或大小。如果对象的 ID 未知或在任何地方都找不到,程序可能会在所有文件系统中搜索具有相同名称、类型和大小的任何对象,或使用其他条件。这就是 Mac OS X别名和 Windows快捷方式当其原始目标缺失时执行的操作(尽管快捷方式仅在 Windows shell 中有效,而别名与 Mac OS 更加集成)。
XCode 可能只是使用用于解析损坏别名的相同函数。