【发布时间】:2015-02-17 17:10:37
【问题描述】:
我需要收集本地文件系统可以访问的所有已挂载“挂载点”的列表。
这包括:
-
/Volumes下的任何通常安装的卷。 - 当前挂载在
/net下的任何 NFS 卷。 - 使用“mount”命令挂载或以某种方式自动挂载的任何本地或远程文件系统。
但我需要避免访问任何可以自动挂载但当前未挂载的文件系统。即,我不想导致任何自动金额。
我目前的方法如下:
- 在循环中调用
FSGetVolumeInfo()以收集所有已知卷。这将为我提供/Volumes和/net, /home下的所有本地驱动器,以及/net下的NFS 挂载。 - 调用
FSGetVolumeParms()以获取每个卷的“设备 ID”(事实证明这是网络卷的挂载路径)。 - 如果 ID 是 POSIX 路径(即它以“/”开头),我在其路径的父级上使用
readdir()来检查父级目录是否实际包含挂载点项目(例如,如果 ID 是/net/MyNetShare,然后我读了/net)。如果它不可用,我认为这是一个带有尚未安装卷的自动安装点,因此将其从我的已安装卷列表中排除。 - 最后,如果卷显示为已安装,我会检查它是否包含任何项目。如果有,我会将其添加到我的列表中。
第 3 步是需要查看路径是否实际挂载的。如果我改为在完整路径上调用 lstat(),它会尝试自动挂载文件系统,这是我需要避免的。
现在,尽管上述方法大部分时间都有效,但仍然存在一些问题:
- 对 BSD 和 Carbon API 的调用组合以及“设备 ID”值的特殊大小写相当不干净。
-
FSGetVolumeInfo()调用为我提供了诸如“/net”和“/home”之类的挂载点,即使它们似乎不是实际的挂载点 - 挂载点更愿意出现在 内部这些.例如,如果我在“/net/MyNFSVolume”上挂载 NFS 共享,我会同时收集“/net”点和“/net/MyNFSVolume”,但“/net”点不是实际卷. - 最糟糕的是,有时上述过程仍然会导致主动尝试联系离线服务器,从而导致长时间超时。
那么,谁能告诉我一个更好的方法来找到所有实际安装的卷?
【问题讨论】:
标签: macos unix filesystems