Existem algumas maneiras diferentes de enumerar volumes montados no OS X, cada um usando um conjunto diferente de APIs. No nível mais alto (e mais fácil), você pode usar o NSfilemanager mountedVolumeURLsIncludingResourceValuesForKeys:options:
. Aqui está um exemplo abreviado:
NSArray *urls = [[NSFileManager defaultManager] mountedVolumeURLsIncludingResourceValuesForKeys:@[NSURLVolumeNameKey] options:0];
for (NSURL *url in urls) {
NSLog(@"Volume mounted at: %@", [url path]);
}
A próxima opção nos leva de volta ao território C - e você estava tão próximo da sua abordagem original. No OS X (e BSD), não há getmntent()
; Em vez disso, existe getmntinfo()
, o que é surpreendentemente semelhante. Para listar volumes montados via getmntinfo()
, você pode fazer o seguinte:
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);
}
Eu usei esses dois APIs lado a lado desde o lançamento de 10.6. getmntinfo()
é sempre mais completo do que [NSFileManager mountedVolumeURLsIncludingResourceValuesForKeys:options:]
: o último filtrará o /dev
e outros sistemas de arquivos que você pode ou não querer saber. Geralmente é confiável, no entanto, para os discos que você conecta ao seu sistema.
O objetivo por trás da estrutura do DiskArbitration é diferente, como você notou. O DiskArbitration é sobre monitoramento e gerenciamento de ativos de disco. Com o DA, você pode ser chamado sempre que um novo disco é montado ou desmontado. Você também pode gerenciar esses discos renomeando, montando, desmontando ou ejetando -os, além de se inserir no processo de montagem/desmontagem - e potencialmente suspender solicitações para fazer o mesmo. Mas, como você apontou, ele não fornece uma interface para listar os discos existentes. Depois de obter sua lista de volumes montados, o DA é uma excelente próxima parada (dependendo, é claro, do seu motivo para obter essa lista!).