2011-05-14 7 views
47

मैं एक कार्यक्रम का पता लगाता है कि अगर एक यूएसबी (या दो या अधिक) में खामियों को दूर कर रहे हैंयूएसबी ड्राइव का पता लगाने के लिए कैसे प्लग इन किया गया है?

कोई भी विचार का निर्माण करने के लिए (और एक हार्ड डिस्क पर किसी भी फ़ोल्डर में सभी सामग्री की प्रतिलिपि) करना चाहते हैं? मैं इस किया है,

using System.Runtime.InteropServices; 

लेकिन यह आसान तरीका नहीं है (कि मेरा मानना ​​है कि)। मुझे कुछ आसान चाहिए।

मेरे पास एक और विचार है (यदि (फ़ोल्डर मौजूद है) तो कॉपी करें) कुछ - लेकिन इसमें कोई समस्या हो सकती है, और मुझे एक अच्छा समाधान चाहिए।

सीरियलपोर्ट नामक एक उपकरण भी हो सकता है; क्या मैं इसका इस्तेमाल कर सकता हूं? यदि हां, तो मैं इसका उपयोग कैसे करूं?

+2

तोड़ इसे नीचे अलग-अलग टुकड़ों में। यूएसबी ड्राइव का पता लगाने वाला कोड एक टुकड़ा है, कोड जो डेटा कॉपी करता है वह दूसरा है। इस समय आप जो टुकड़े कर सकते हैं। –

+0

हाँ! मैं अब फाइल कॉपी कर सकता हूं .. बैच फ़ाइल के साथ प्रोग्राम मौजूद नहीं हो सकता है यदि प्रोग्राम मौजूद नहीं है – angel

+0

संबंधित: http://stackoverflow.com/questions/620144/detecting-usb-drive-insertion-and-removal -using-windows-service-and-c-sharp – DuckMaestro

उत्तर

53

यह हटाने योग्य के लिए जाँच करने के लिए आसान है: यहाँ मामले में एक तिहाई समाधान आप अधिक विकल्प चाहते थे (? मूल रूप से वे सभी एक ही हैं, लेकिन विकल्प है, अच्छा है सही) है

var drives = DriveInfo.GetDrives() 
    .Where(drive => drive.IsReady && drive.DriveType == DriveType.Removable); 

यह सब हटाने योग्य उपकरणों है कि वर्तमान में जाया जा सकता है की एक सूची प्रदान करेगा: उपकरणों, लेकिन यह गारंटी यह एक USB डिवाइस है कि नहीं करता है। अधिक जानकारी:

+0

आप "ड्राइव" कहां घोषित करते हैं ?? – angel

+3

@angel: आपको अलग-अलग 'ड्राइव' घोषित करने की आवश्यकता नहीं है: 'drive' lamba अभिव्यक्ति के लिए इनपुट पैरामीटर है जिसे मैं' .Where() 'एक्सटेंशन विधि के लिए इनपुट के रूप में उपयोग करता हूं। यह लिंक सुविधाओं का हिस्सा है जो .NET Framework 3.5 के साथ घुसपैठ कर रहे थे। लिंक पर अधिक जानकारी: http://msdn.microsoft.com/en-us/vbasic/aa904594। –

+0

क्या आपको सीडी-रोम ड्राइव, मेमोरी कार्ड ड्राइव और कभी-कभी हार्ड ड्राइव भी नहीं मिलेंगे (मेरे पीसी में, मेरा सैटा ड्राइव सी ड्राइव के बावजूद हटाने योग्य के रूप में दिखाई देता है)? साथ ही, क्या आपको यह पता लगाने के लिए निरंतर इस पहचान के माध्यम से लूप करना होगा कि ड्राइव कब प्लग हो या क्या कोई ट्रिगर है? – IAmTimCorey

18

यह पता लगाना कि क्या यूएसबी ड्राइव डाला गया है, यह आसान नहीं है। हालांकि, यह निश्चित रूप से संभव है और आपके लिए काम किया गया है।

http://www.codeproject.com/KB/system/DriveDetector.aspx

http://www.codeproject.com/Messages/2126647/Re-Csharp-USB-Detection.aspx

या तो समाधान आप के लिए ठीक से काम करना चाहिए: यहाँ दो लिंक है कि प्रत्येक विस्तार सी # में यह करने के लिए पर एक जवाब है। आप उन्हें अपनी जरूरतों के अनुरूप अनुकूलित कर सकते हैं।

संपादित करें:

http://tempuzfugit.wordpress.com/2007/10/08/external-storage-unit-detection-with-c-in-net-usb-card-readers-etc/

2

माइक्रोसॉफ्ट एपीआई कोड पैक। शैलऑब्जेक्ट वाटर वर्ग।

11

यहाँ एक कोड है कि मेरे लिए काम करता है, जो वेबसाइट मेरी प्रारंभिक परीक्षणों के साथ संयुक्त ऊपर से एक हिस्सा है: http://www.codeproject.com/KB/system/DriveDetector.aspx

यह मूलतः आपके प्रपत्र खिड़कियों संदेशों को सुनने में आता है, यूएसबी ड्राइव और (सीडी के लिए फिल्टर -dvds), संदेश की lparam संरचना पकड़ लेता है और ड्राइव अक्षर निकाल देता है।

protected override void WndProc(ref Message m) 
    { 

     if (m.Msg == WM_DEVICECHANGE) 
     { 
      DEV_BROADCAST_VOLUME vol = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME)); 
      if ((m.WParam.ToInt32() == DBT_DEVICEARRIVAL) && (vol.dbcv_devicetype == DBT_DEVTYPVOLUME)) 
      { 
       MessageBox.Show(DriveMaskToLetter(vol.dbcv_unitmask).ToString()); 
      } 
      if ((m.WParam.ToInt32() == DBT_DEVICEREMOVALCOMPLETE) && (vol.dbcv_devicetype == DBT_DEVTYPVOLUME)) 
      { 
       MessageBox.Show("usb out"); 
      } 
     } 
     base.WndProc(ref m); 
    } 

    [StructLayout(LayoutKind.Sequential)] //Same layout in mem 
    public struct DEV_BROADCAST_VOLUME 
    { 
     public int dbcv_size; 
     public int dbcv_devicetype; 
     public int dbcv_reserved; 
     public int dbcv_unitmask; 
    } 

    private static char DriveMaskToLetter(int mask) 
    { 
     char letter; 
     string drives = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //1 = A, 2 = B, 3 = C 
     int cnt = 0; 
     int pom = mask/2; 
     while (pom != 0) // while there is any bit set in the mask shift it right   
     {   
      pom = pom/2; 
      cnt++; 
     } 
     if (cnt < drives.Length) 
      letter = drives[cnt]; 
     else 
      letter = '?'; 
     return letter; 
    } 

जोड़ने के लिए मत भूलना:

using System.Runtime.InteropServices; 

और निम्न स्थिरांक:

const int WM_DEVICECHANGE = 0x0219; //see msdn site 
    const int DBT_DEVICEARRIVAL = 0x8000; 
    const int DBT_DEVICEREMOVALCOMPLETE = 0x8004; 
    const int DBT_DEVTYPVOLUME = 0x00000002; 
+1

एक टिप्पणी - अगर (m.Msg == WM_DEVICECHANGE) के आसपास प्रयास करें। – Onsightfree