كيف يمكنني الكشف عن ما إذا كان القرص الصلب متصل عن طريق USB ؟

StackOverflow https://stackoverflow.com/questions/220123

  •  03-07-2019
  •  | 
  •  

سؤال

أنا أحاول أن أكتب قليلا برنامج النسخ الاحتياطي للأصدقاء والعائلة تريد أن تكون سهلة الاستخدام ممكن.أنا لا أريد أن أطلب المستخدم حيث أن النسخ الاحتياطي البيانات الخاصة بهم ، أنا فقط أريد البحث عن واستخدام الأولى القرص الصلب USB المتصلة بجهاز الكمبيوتر.الحصول على معرف فريد من القرص الصلب ربما يكون فكرة جيدة جدا, مجرد التحقق في المرة القادمة النسخ الاحتياطي يعمل.

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

المحلول 2

وقضيت وقتا قليلا ونظروا حولهم وجدت وظيفة تسمى SetupDiEnumDeviceInfo التي لم تقدم حلا لمعرفة ما إذا كان القرص الصلب قابل للإزالة أو لا ولكن مع تلك المعلومات ما زلت لا يمكن (حتى الآن) تعيين ما أجد مرة أخرى إلى حرف محرك الأقراص!

وهنا ما لدي حتى الآن (رمز التالي بإنشاء DLL):

#include "stdafx.h"
#include <setupapi.h>
#include <devguid.h>
#include <cfgmgr32.h>
extern "C" __declspec(dllexport) int usb_hard_drives() {
  HDEVINFO hdevinfo = SetupDiGetClassDevs(&GUID_DEVCLASS_DISKDRIVE, NULL, NULL, DIGCF_PRESENT);
  if (hdevinfo == INVALID_HANDLE_VALUE) return -1;
  DWORD MemberIndex = 0;
  SP_DEVINFO_DATA sp_devinfo_data;
  ZeroMemory(&sp_devinfo_data, sizeof(sp_devinfo_data));
  sp_devinfo_data.cbSize = sizeof(sp_devinfo_data);
  int c = 0;
  while (SetupDiEnumDeviceInfo(hdevinfo, MemberIndex, &sp_devinfo_data)) {
    DWORD PropertyRegDataType;
    DWORD RequiredSize;
    DWORD PropertyBuffer;
    if (SetupDiGetDeviceRegistryProperty(hdevinfo, &sp_devinfo_data, SPDRP_CAPABILITIES, &PropertyRegDataType, (PBYTE)&PropertyBuffer, sizeof(PropertyBuffer), &RequiredSize)) {
      if (PropertyBuffer && CM_DEVCAP_REMOVABLE == CM_DEVCAP_REMOVABLE) {
        // do something here to identify the drive letter.
        c++;
      }
    }       
    MemberIndex++;
  }
  SetupDiDestroyDeviceInfoList(hdevinfo);
  return c;
}

نصائح أخرى

أعلم أن سؤالك هو معلم Win32, ولكن هذا هو بسيط جدا مع .صافي:

foreach (IO.DriveInfo drive in IO.DriveInfo.GetDrives()) {
  if ((drive.DriveType == IO.DriveType.Removable)) {
    // this is a removable drive
  }
}

انظر بالسيارة.اسم محرك الأقراص.VolumeLabel للحصول على التسمية.يمكنك أيضا الحصول على حجم وجعل تكهنا أنه عصا USB (كبيرة بما يكفي واحد) -- القابلة للإزالة يمكن أن يعني إما مرن أو USB ، وفقا مستندات.

كملاحظة جانبية, من واجهة المستخدم المنظور ، أقترح أول مرة تجد محرك جديد ويقدم المستخدم و تسأل "هل هذا هو محرك الأقراص الذي تريد استخدامه على النسخ الاحتياطي؟".وإلا فإن هناك إمكانات كبيرة عن قصد محو البيانات على مفتاح usb الذي حدث أن يكون في الوتر.لا شيء يدمر مصداقية برنامج النسخ الاحتياطي مثل عندما يدمر البيانات الخاصة بك.:)

وتحتاج إلى استخدام RegisterDeviceNotification وظيفة. هنا عبارة بعض المؤشرات حول كيفية للقيام بذلك. واحد أكثر نموذج التعليمات البرمجية

ويمكنك تعداد كافة أجهزة التخزين الشامل باستخدام هذه العينة . في العام بحث عن SetupDiXXX المعهد.

تجدر الإشارة إلى أن يأخذ في الاعتبار الطبيعة الديناميكية لأجهزة USB، وذلك باستخدام آلية التبليغ هو IMHO إلزامي. قد تجد جهاز تحليل نفسك ذلك بالفعل فصل أو مفقودة الجهاز الجديد التي وصلت للتو.

بضع قطع من المعلومات التي يمكن جمعها من دون الكثير من المتاعب:

  • استخدام GetDriveType العثور على أول محرك أقراص قابل للإزالة ، اختبار إذا للكتابة الإعلام موجود (والتي سوف إلى حد كبير يستبعد محركات الأقراص المضغوطة).قد تحتاج أيضا إلى النظر في مزيد من السلاسل المتاحة عند الاستعلام عن المعلومات عبر محرك win32.
  • استخدام libusb أن نرى فيها أول فئة تخزين USB (من المرجح أن تكون الفلاش أو القرص الصلب)
  • هذا C# المادة نقطة نحو win32 disk drive دروس كنت قد تكون قادرة على الاستفادة من.

بعد إجابتك هنا عندما تجد ذلك!

-آدم

ولقد وجدت وظيفة كبيرة في Win32 API لاختبار نوع محرك الأقراص.

if( 2 == ::getDriveType( <driveletter> )){
  // its removable 
}

والقيم عودة وظيفة:

وDRIVE_UNKNOWN 0: نوع محرك لا يمكن تحديدها.

وDRIVE_NO_ROOT_DIR 1: مسار الجذر غير صالح. على سبيل المثال، لا يوجد حجم شنت في المسار المحدد.

وDRIVE_REMOVABLE 2: الدافع له الوسائط القابلة للإزالة. على سبيل المثال، محرك الأقراص المرنة، حملة الإبهام، أو قارئ بطاقة فلاش.

وDRIVE_FIXED 3: محرك الأقراص وحددت وسائل الإعلام. على سبيل المثال، محرك القرص الثابت أو محرك أقراص فلاش.

وDRIVE_REMOTE 4: محرك الأقراص هو (شبكة) محرك أقراص بعيد.

وDRIVE_CDROM 5: محرك الأقراص هو محرك CD-ROM

.

وDRIVE_RAMDISK 6: محرك الأقراص هو قرص RAM

.

HTTP: // MSDN .microsoft.com / EN-US / مكتبة / ويندوز / المكتبي / aa364939 (ت = vs.85) .aspx اتصال

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