سؤال

أنا مهتم بتكرار جميع أنظمة الملفات المثبتة على OSX (تعمل حاليًا على 10.9 مافريك). أنا أبحث عن شيء مشابه لـ GetMntent () أو إخراج أمر Mount Shell (على الرغم من أنني أريد أن أفعل ذلك من الهدف C ، لذلك من الواضح أن تحليل إخراج أمر shell ليس الأمثل).

لقد كنت أبحث قليلاً في إطار تحكيم القرص ، ويبدو أنه يمكن إخطارني بأحداث Mount و Unmount باستخدام هذا الإطار. قد أفتقد شيئًا هناك ، لكن ليس من الواضح بالنسبة لي إذا كان هناك طريقة لتكرار أنظمة الملفات المحملة الحالية باستخدام تحكيم القرص.

لقد استكشفت باستخدام GetFsent () الذي بدا أنه سيوفر حلاً ، لكن بعد الاختبار اكتشفت أنني لا أحصل على أكثر من إدخال واحد من تكرار GetFsent (). انظر الرمز التالي:

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

الإدخال الوحيد الذي أحصل عليه هنا هو لنظام / ملفات. في المرة الثانية التي أسميها getfsent () ، تُرجع فارغة ، كما لو لم تكن هناك إدخالات مزيد من الإدخالات. يوضح لي أمر 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 () فسأكون مهتمًا بذلك أيضًا.

هل كانت مفيدة؟

المحلول

هناك عدة طرق مختلفة لتعداد أحجام مثبتة على OS X ، كل منها يستخدم مجموعة مختلفة من واجهات برمجة التطبيقات. على أعلى مستوى (وأسهل) ، يمكنك استخدام 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. getmntinfo() دائما أكثر اكتمالا من [NSFileManager mountedVolumeURLsIncludingResourceValuesForKeys:options:]: سوف يقوم الأخير بتصفية /dev ونظم الملفات الأخرى التي قد ترغب أو لا ترغب في معرفتها. ومع ذلك ، من الموثوق بها بشكل عام للأقراص التي تقوم بتوصيلها في نظامك.

الغرض وراء إطار القرص مختلف ، كما لاحظت. القرص يدور حول مراقبة وإدارة أصول القرص. مع DA ، يمكنك الحصول على استدعاء كلما تم تركيب قرص جديد أو غير مثبت. يمكنك أيضًا إدارة تلك الأقراص عن طريق إعادة تسمية أو تصاعد أو إلغاء التغلب أو إخراجها ، وكذلك إدخال نفسك في عملية Mount/Unmount - وربط الطلبات المحتملة لفعل الشيء نفسه. ولكن ، كما أشرت ، لا يوفر واجهة لإدراج الأقراص الموجودة. بمجرد حصولك على قائمة أحجام المركبة ، تعتبر DA محطة تالية ممتازة (اعتمادًا ، بالطبع ، على سبب الحصول على هذه القائمة!).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top