2009-11-25 18 views
7

विंडोज़ (एक्सपी -7) पर यूएसबी फ्लॉपी ड्राइव और यूएसबी फ्लैश ड्राइव के बीच प्रोग्रामेटिक रूप से भिन्नता, क्या सी ++ में यूएसबी फ्लॉपी ड्राइव और यूएसबी फ्लैश ड्राइव के बीच प्रोग्रामेटिक रूप से अंतर करने का एक विश्वसनीय तरीका है?विंडोज़

फिलहाल, मैं अपडेट प्राप्त करने के लिए डब्लूएमआई का उपयोग कर रहा हूं जब नए Win32_LogicalDisk उदाहरण पाए जाते हैं, और फिर मूल प्रकार को जानने के लिए लॉजिकलडिस्क ऑब्जेक्ट के ड्राइवटाइप विशेषता का उपयोग करते हैं। यह बहुत अच्छी तरह से काम करता है, सिवाय इसके कि फ्लॉपी ड्राइव और यूएसबी फ्लैश ड्राइव ड्राइवटाइप DRIVE_REMOVABLE दोनों हैं, इसलिए उन (फ्लॉपी बनाम फ्लैश) के बीच अंतर करने के लिए, मैं IOCTL_STORAGE_GET_HOTPLUG_INFO इंटरफ़ेस का उपयोग कर रहा हूं यह पता लगाने के लिए कि डिवाइस हॉटप्लगेबल है या नहीं, प्रिंसिपल पर इसका मतलब था कि यह एक फ्लैश ड्राइव था और फ्लॉपी नहीं था। दोबारा, मुझे लगता है कि यह आंतरिक फ्लॉपी ड्राइव के मामले में काफी अच्छी तरह से काम करता है (अगर थोड़ा अक्षम, डब्लूडीके एपीआई और डब्ल्यूएमआई दोनों जानकारी प्राप्त करने के लिए), लेकिन दुर्भाग्य से यूएसबी फ्लॉपी ड्राइव भी बहुत समय से हॉटप्लगेबल हैं, इसलिए वहां फ़्लैश और यूएसबी फ्लॉपी ड्राइव के बीच अंतर करने का कोई स्पष्ट तरीका नहीं है, जिसे मैं देख सकता हूं। मुझे पता है कि काम कर सकते हैं, जैसे कि आरक्षित ड्राइव पर मैप किया गया है या नहीं: (संपादित करें: मशीन के पास निश्चित रूप से प्रासंगिक है अगर मशीन में निश्चित रूप से फ्लॉपी ड्राइव है - MS-KB: How to change drive letter assignments in Windows XP देखें), या विवरण को देखते हुए, लेकिन मैं वास्तव में कुछ और अधिक विश्वसनीय पसंद है।

लंबी व्याख्या के बारे में खेद है, लेकिन बस स्पष्ट होना चाहता था! धन्यवाद

+1

ए: और बी: floppies_ के लिए _reserved हैं? स्रोत? – MSalters

+1

मुझे यह मिला [एमएस-केबी: विंडोज एक्सपी में ड्राइव लेटर असाइनमेंट कैसे बदलें] (http://support.microsoft.com/kb/307844), और जिस तरह से वे इसे वाक्यांश देते हैं, लेकिन जैसा कि यह भी बताता है , अगर मशीन में फ्लॉपी ड्राइव नहीं है, तो उन्हें अन्य ड्राइव्स के लिए इस्तेमाल किया जा सकता है, इसलिए तर्कसंगत रूप से यह एक गलत नामक है, और निश्चित रूप से फ्लॉपी ड्राइव होने के कारण ड्राइव का संकेत नहीं है। मैं इसे थोड़ा स्पष्ट बनाने के लिए सवाल दोहरा दूंगा। – user82116

+0

आह, यह उपयोगकर्ता दृष्टिकोण से है, जब आप मैन्युअल रूप से ड्राइवलेटर्स बदल रहे हैं। तब समझ में आता है, मैं एक ओएस दृष्टिकोण से सोच रहा था। – MSalters

उत्तर

5

क्या आपने Win32_LogicalDisk.MediaType को आजमाया था? इसमें फ्लॉपी डिस्क के लिए विशिष्ट गणनाएं हैं। सुनिश्चित करें कि ड्राइव में कोई डिस्क नहीं होने पर आप इसे आजमाएं।

+0

किसी और को इसकी आवश्यकता होने पर, मेरे परीक्षण में पाया गया कि जब कोई मीडिया मौजूद नहीं है तो यह अनुमानित मीडिया प्रकार (यूएसबी फ्लॉपी बनाम फ्लैश ड्राइव के लिए निश्चित रूप से पर्याप्त है) को सही ढंग से वापस कर देता है, लेकिन इसकी गारंटी नहीं है - [डॉक्स] से (http://msdn.microsoft.com/en-us/library/aa394173%28VS.85%29.aspx): "Win32_LogicalDisk.Media प्रकार: वर्तमान में लॉजिकल ड्राइव में मौजूद मीडिया का प्रकार। यह मान एक होगा Winioctl.h में परिभाषित MEDIA_TYPE गणना के मान। यदि वर्तमान में ड्राइव में कोई मीडिया नहीं है तो मान हटाने योग्य ड्राइव के लिए सटीक नहीं हो सकता है। " – user82116

+0

बेशक, स्थिति "ड्राइव में कोई मीडिया नहीं" का तात्पर्य है कि यह एक मीडिया लोडिंग ड्राइव है, और इसलिए यूएसबी फ्लैश ड्राइव नहीं है। – MSalters

+0

नीचे मेरा जवाब देखें। इसके अलावा, कई यूएसबी फ्लैश डिस्क खुद को "हटाने योग्य मीडिया" के रूप में घोषित करना शुरू कर देंगे और "ड्राइव में कोई मीडिया" शुरू नहीं करेंगे (और वे आदेश स्वीकार करने के लिए तैयार होने के बाद मीडिया को सम्मिलित करेंगे) – Boris

4

आप आकार विशेषता (यूएसबी> 1.4 एमबी) का उपयोग कर सकते हैं, ऐसा नहीं है कि जल्द ही 1.4 एमबी फ्लैश ड्राइव को पूरा करने का कोई मौका है।

+0

बेहतर 2.88 एमबी बनाओ, हालांकि मुझे विश्वास है कि फ्लॉपी प्रारूप जापान के बाहर असामान्य था। – MSalters

+0

मुझे नहीं लगता कि सभी ज़िप ड्राइव (जो 750 एमबी तक का समर्थन करती हैं) को फ्लॉपी भी नहीं माना जाता है। –

5

यूएसबी स्तर पर, कुंजी पर एक पारंपरिक डिस्क और यूएसबी-फ्लॉपी के बीच अंतर करने का कोई तरीका नहीं है। जिसका मतलब विंडोज़ है, भरोसेमंद नहीं बता सकता कि क्या है।

कुछ संकेत हैं जो आप एकत्र कर सकते हैं: फ़्लॉपीज़: ए। बड़े पैमाने पर भंडारण प्रोटोकॉल सीबीआई/सीबी बी है। एससीएसआई यूएफआई

लेकिन, यूएसबी उपकरणों की दुनिया में, हर कोई जो कुछ भी चाहता है वह करता है। एकमात्र परीक्षण है: "क्या यह विंडोज़ पर काम करता है"। और विंडोज सिर्फ आकार की जांच करता है, अगर यह एक यूएसबी डिवाइस हटाने योग्य-मीडिया सेट और पारंपरिक फ्लॉपी आकारों के साथ है, तो यह इसे फ्लॉपी माना जाएगा।

"असली" फ्लॉपी के बारे में नहीं कह सकता है, लेकिन यूएसबी संलग्न के साथ, कोई निश्चित तरीका नहीं है।

3

चेक करने के लिए स्पष्ट संपत्ति IOCTL_DISK_GET_DRIVE_GEOMETRY होगी। यह आपको (अन्य चीजों के साथ) MEDIA_TYPE प्राप्त करता है। कुछ भी RemovableMedia और FixedMedia एक फ्लॉपी है।