2013-03-11 17 views
5

मैं सी/सी ++ के साथ विंडोज कंप्यूटर पर सभी भौतिक ड्राइव पथ (\\। \ PhysicalDriveX) कैसे प्राप्त कर सकता हूं?सभी भौतिक ड्राइव सूचीबद्ध करना (विंडोज़)

this में उत्तर तार्किक ड्राइव अक्षर प्राप्त करने का सुझाव देते हैं, और फिर उस घुड़सवार ड्राइव से संबंधित भौतिक ड्राइव प्राप्त करने का सुझाव देते हैं। समस्या यह है कि, मैं सभी कंप्यूटर से जुड़े भौतिक ड्राइव, माउंट नहीं किए गए ड्राइव सहित प्राप्त करना चाहता हूं।

अन्य उत्तर 0-15 से एक मूल्य बढ़ाने का सुझाव देते हैं और पता चल सके कि एक ड्राइव वहां मौजूद (\\। \ PhysicalDrive0, \\। \ PhysicalDrive1, ...) या WMIC सभी ड्राइव सूची बुला। [

जैसा कि ऐसा लगता है कि वे काम करेंगे, ऐसा लगता है कि वे लेने का सबसे अच्छा तरीका नहीं हैं। क्या GetPhysicalDrives जैसे कोई साधारण कार्य नहीं है जो बस std::string के वेक्टर को सभी भौतिक ड्राइव के पथों को वापस लाता है?

+1

क्या आपने देखा है कि 'boost :: filesystem' आपकी मदद कर सकता है? – AxelOmega

+0

मैंने अभी तक 'बूस्ट' में नहीं देखा है, नहीं। मैं इस पर एक नज़र डालेगा कि यदि कोई जवाब नहीं है तो कोई अन्य लाइब्रेरी की आवश्यकता नहीं है। – hetelek

+0

लॉजिकल ड्राइव के लिए ड्राइव अक्षर मौजूद हैं या नहीं ... क्या आपके पास अभी भी भौतिक डिस्क के बारे में कोई वैध चिंता नहीं है, जिसमें कोई लॉजिकल ड्राइव (मान्यता प्राप्त विभाजन) नहीं है। –

उत्तर

4

आप QueryDosDevice का उपयोग कर सकते हैं। विवरण के आधार पर, आप उम्मीद करेंगे कि यह C: और D: जैसी चीजों को सूचीबद्ध करे, लेकिन इसमें PhysicalDrive0, PhysicalDrive1 जैसी चीजें भी सूचीबद्ध होंगी।

बड़ी कमी यह है कि इसमें कई अन्य डिवाइस नाम भी सूचीबद्ध होंगे जिनकी आपको शायद परवाह नहीं है, इसलिए (उदाहरण के लिए) मेरी मशीन पर, मुझे लगभग 600 डिवाइस नामों की एक सूची मिलती है, जिनमें से केवल एक आप जिस चीज की परवाह करते हैं उससे काफी कम प्रतिशत संबंधित है।

बस मामले में आप परवाह करते हैं, कुछ (पुराने) नमूना कोड:

#define WIN32_LEAN_AND_MEAN 
#include <windows.h> 

#include <iostream> 

int main(int argc, char **argv) { 

    char physical[65536]; 
    char logical[65536]; 

    if (argc > 1) { 
     for (int i=1; i<argc; i++) { 
      QueryDosDevice(argv[i],logical, sizeof(logical)); 
      std::cout << argv[i] << " : \t" << logical << std::endl << std::endl; 
     } 
     return 0; 
    } 

    QueryDosDevice(NULL, physical, sizeof(physical)); 

    std::cout << "devices: " << std::endl; 

    for (char *pos = physical; *pos; pos+=strlen(pos)+1) { 
     QueryDosDevice(pos, logical, sizeof(logical)); 
     std::cout << pos << " : \t" << logical << std::endl << std::endl; 
    }  

    return 0; 
}  

हालांकि, अगर मैं `devlist की तरह इस चलाने | grep "^ भौतिक", यह भौतिक ड्राइव सूचीबद्ध करता है।

+0

यह एक पूरी तरह से अलग कार्य के लिए चाहता था लेकिन QueryDosDevice का उपयोग करने के तरीके पर मुझे यह सबसे अच्छा उदाहरण मिला है; आपके लिए +1 महोदय – CommanderBubble

संबंधित मुद्दे