我对OSX上的所有固定文件系统(当前运行10.9 Mavericks)感兴趣。我正在寻找类似于getMntent()或Mount shell命令的输出的东西(尽管我想从目标C进行操作,因此解析shell命令的输出显然不是最佳的)。

我一直在寻找磁盘仲裁框架,看来我可以使用此框架通知我的坐骑和卸载事件。我可能在那里缺少一些东西,但是对于我来说,如果有一种方法可以使用磁盘仲裁迭代现有的已安装文件系统。

我已经使用getfsent()探索了它,这似乎可以提供解决方案,但是在测试后,我发现我从迭代getfsent()中获得的条目并不多。请参阅以下代码:

struct fstab* fsentry;
setfsent();
fsentry = getfsent();
while(fsentry)
{
    //do something with fsentry
    fsentry = getfsent();
}
endfsent();

我到达这里的唯一条目是 /文件系统。我第二次致电getfsent()它返回null,就好像没有更多条目一样。 Mount命令向我展示了其他几个,包括已安装的CIFS/SMB文件系统:

/dev/disk0s2 on / (hfs, local, journaled)
devfs on /dev (devfs, local, nobrowse)
map -hosts on /net (autofs, nosuid, automounted, nobrowse)
map auto_home on /home (autofs, automounted, nobrowse)
//user@<ip address>/public on /Volumes/public (smbfs, nodev, nosuid, mounted by user)

因此,似乎GetFsent()开始做我期望的事情,但是出于某种原因停止了?

我的问题总结是:在OSX上迭代文件系统的最佳方法是什么?

如果有人可以回答为什么我只得到getfsent()的结果,我也会对此感兴趣。

有帮助吗?

解决方案

有几种不同的方法可以使用不同的API列出OS X上的安装量。在最高(最简单)的水平上,您可以使用NSFileManager的 mountedVolumeURLsIncludingResourceValuesForKeys:options:. 。这是一个缩写的例子:

NSArray *urls = [[NSFileManager defaultManager] mountedVolumeURLsIncludingResourceValuesForKeys:@[NSURLVolumeNameKey] options:0];
for (NSURL *url in urls) {
  NSLog(@"Volume mounted at: %@", [url path]);
}

下一个选项将我们带回C领域 - 您的原始方法非常接近。在OS X(和BSD)上,没有 getmntent();相反,有 getmntinfo(), ,非常相似。列出通过 getmntinfo(), ,您可以执行以下操作:

struct statfs* mounts;
int num_mounts = getmntinfo(&mounts, MNT_WAIT);
if (num_mounts < 0) {
  // do something with the error
}

for (int i = 0; i < num_mounts; i++) {
  NSLog(@"Disk type '%s' mounted at: %s", mounts[i].f_fstypename, mounts[i].f_mntonname);
}

自10.6发行以来,我已经并排使用了这两个API。 getmntinfo() 总是比 [NSFileManager mountedVolumeURLsIncludingResourceValuesForKeys:options:]: :后者将过滤 /dev 以及您可能想知道或可能不知道的其他文件系统。但是,对于您插入系统的磁盘通常是可靠的。

正如您所注意到的那样,Diskarbitation框架背后的目的是不同的。磁盘差是监视和管理磁盘资产。使用DA,只要安装新磁盘或卸载新磁盘,就可以被调用。您还可以通过重命名,安装,卸载或弹出它们来管理这些磁盘,并在安装/卸载过程中插入自己,并可能暂停请求执行此操作。但是,正如您指出的那样,它没有提供用于列出现有磁盘的接口。一旦获得了安装卷的列表,DA将是一个绝佳的下一站(当然,取决于您获取该列表的原因!)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top