質問

OSXのすべてのマウントされたファイルシステムを反復することに興味があります(現在10.9 Mavericksを実行しています)。 GetMntent()またはMount Shellコマンドの出力に似たものを探しています(目的Cからそれを行いたいので、シェルコマンドの出力を解析することは明らかに最適ではありません)。

私はディスク仲裁フレームワークを少し見てきましたが、このフレームワークを使用してマウントイベントやアンマウントイベントについて通知できるようです。私はそこに何かが欠けているかもしれませんが、ディスク仲裁を使用して既存のマウントされたファイルシステムを反復する方法があるかどうかは明確ではありません。

getfsent()を使用して検討しましたが、これは解決策を提供するように思われましたが、テストの後、getfsent()から複数のエントリを取得していないことがわかりました。次のコードを参照してください。

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

私がここで取得している唯一のエントリは、 /ファイルシステム用です。 getfsent()に電話すると、エントリがもうないかのようにnullを返します。マウントコマンドは、マウントされた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()から1つの結果しか得られていない理由について答えを持っている場合、私もそれに興味があります。

役に立ちましたか?

解決

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

10.6のリリース以来、これらの両方のAPIを並べて使用しました。 getmntinfo() 常により完全です [NSFileManager mountedVolumeURLsIncludingResourceValuesForKeys:options:]: :後者はフィルタリングします /dev そして、あなたが知りたくないかもしれないし、そうでないかもしれない他のファイルシステム。ただし、システムに接続するディスクについては、一般的に信頼できます。

あなたが気づいたように、ディスカビットレーションのフレームワークの背後にある目的は異なります。 Diskarbitrationとは、ディスク資産の監視と管理に関するものです。 DAを使用すると、新しいディスクがマウントまたはマウントされていないときはいつでも呼び出すことができます。また、それらのディスクを変更、マウント、アンマップ、または排出すること、およびマウント/アンマウントプロセスに挿入し、同じことを行うためのリクエストを停止する可能性があります。しかし、あなたが指摘したように、それは既存のディスクをリストするためのインターフェイスを提供しません。取り付けられたボリュームのリストを取得したら、DAは次の優れた停留所になります(もちろん、そのリストを取得する理由に応じて!)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top