Существует несколько различных способов перечисления монтированных объемов на OS X, каждый из которых использует различный набор API. На самом высоком (и легком) уровне вы можете использовать NSFileManager's 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);
}
Я использовал оба эти APIS бок о бок с момента выпуска 10.6. getmntinfo()
всегда более полным, чем [NSFileManager mountedVolumeURLsIncludingResourceValuesForKeys:options:]
: Последний отфильтровал /dev
и другие файловые системы, о которых вы можете или не можете знать. Однако, как правило, надежно для дисков, которые вы подключаете к своей системе.
Как вы заметили, цель, лежащая в основе рамки дискарбита, отличается. Дискарбит - это мониторинг и управление дисковыми активами. С DA вас могут вызвать всякий раз, когда новый диск монтируется или не установлен. Вы также можете управлять этими дисками, переименовав, устанавливая, подчинившись или вытесняя их, а также вставив себя в процесс крепления/непредубегаемости - и потенциально приостанавливая запросы на то же самое. Но, как вы указали, он не предоставляет интерфейс для перечисления существующих дисков. Как только вы получите свой список монтированных объемов, DA станет отличной следующей остановкой (в зависимости, конечно, по вашей причине получить этот список!).