Frage

Ich bin daran interessiert, alle montierten Dateisysteme unter OSX (derzeit 10,9 Mavericks) zu iterieren. Ich suche etwas Ähnliches wie GetMntent () oder die Ausgabe des Befehls zur Mount Shell (obwohl ich es von Objective C tun möchte, ist es offensichtlich nicht optimal, die Ausgabe eines Shell -Befehls zu analysieren).

Ich habe mich ein wenig im Schiedsgericht der Festplatten angesehen, und es scheint, dass ich mit diesem Framework über Mount- und Unmontal -Ereignisse informiert werden kann. Ich fehlt dort vielleicht etwas, aber es ist mir nicht klar, ob es eine Möglichkeit gibt, vorhandene montierte Dateisysteme mithilfe von Festplatten -Schiedsverfahren zu iterieren.

Ich habe mit GetfSent () untersucht, was schien, dass es eine Lösung liefern würde, aber nach dem Testen stellte ich fest, dass ich nicht mehr als einen Eintrag von iterierendem GetfSent () bekomme. Siehe den folgenden Code:

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

Der einzige Eintrag, den ich hier bekomme, ist für das / Dateisystem. Beim zweiten Mal rufe ich GetfSent () an, es gibt NULL zurück, als ob es keine Einträge mehr gibt. Der Befehl montage zeigt mir mehrere andere, darunter ein montiertes CIFS/SMB -Dateisystem:

/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)

Es scheint also, als würde GetFSent () das tun, was ich erwarte, aber aus irgendeinem Grund hört auf?

Meine Frage in Zusammenfassung lautet: Was ist der beste Weg, um Dateisysteme unter OSX zu iterieren?

Wenn jemand eine Antwort hat, warum ich nur ein Ergebnis von GetfSent () bekomme, würde ich mich auch daran interessieren.

War es hilfreich?

Lösung

Es gibt verschiedene Möglichkeiten, um montierte Volumina auf OS X aufzählten, jeweils A mit unterschiedlichen APIs. Auf höchstem (und einfachsten) Ebene können Sie NSFilemanager's verwenden mountedVolumeURLsIncludingResourceValuesForKeys:options:. Hier ist ein abgekürztes Beispiel:

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

Die nächste Option führt uns zurück zu C Territory - und Sie waren Ihrem ursprünglichen Ansatz so nahe. Auf OS X (und BSD) gibt es nicht getmntent(); Stattdessen gibt es getmntinfo(), was auffallend ähnlich ist. Um montierte Volumes über aufzulisten getmntinfo(), Sie können Folgendes tun:

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);
}

Ich habe diese beiden APIs seit der Veröffentlichung von 10,6 nebeneinander verwendet. getmntinfo() ist immer vollständiger als [NSFileManager mountedVolumeURLsIncludingResourceValuesForKeys:options:]: Letzteres filtert die /dev und andere Dateisysteme, über die Sie möglicherweise wissen möchten oder nicht. Es ist jedoch im Allgemeinen für die Festplatten, die Sie in Ihr System anschließen, zuverlässig.

Der Zweck hinter dem Diskarbitration -Framework ist, wie Sie bemerkt haben, unterschiedlich. Bei Diskarbitration geht es um die Überwachung und Verwaltung von Festplattenvermögen. Mit DA können Sie aufgerufen werden, wenn eine neue Festplatte montiert oder unmontiert ist. Sie können diese Datenträger auch verwalten, indem Sie sie umbenennen, montieren, abkassieren oder ausgeworfen und sich in den Mount/Unmount -Prozess einfügen - und möglicherweise Anfragen aussetzen, um dasselbe zu tun. Wie Sie betonten, bietet es jedoch keine Schnittstelle für die Auflistung vorhandener Datenträger. Sobald Sie Ihre Liste der montierten Bände erhalten haben, ist DA ein ausgezeichneter nächster Stopp (abhängig von Ihrem Grund, diese Liste zu erhalten!).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top