2013-03-11 44 views
5

Làm thế nào tôi có thể nhận được tất cả các đường dẫn ổ đĩa vật lý (\\. \ PhysicalDriveX) trên máy tính Windows, với C/C++?Liệt kê tất cả các ổ đĩa vật lý (Windows)

Câu trả lời trong câu hỏi this gợi ý nhận được ký tự ổ đĩa logic và sau đó nhận ổ đĩa vật lý tương ứng với ổ đĩa được gắn kết đó. Vấn đề là, tôi muốn có được tất cả ổ đĩa vật lý được kết nối với máy tính, kể cả các ổ đĩa không được gắn kết.

Câu trả lời khác đề xuất tăng giá trị từ 0-15 và kiểm tra xem ổ đĩa có tồn tại không (\\. \ PhysicalDrive0, \\. \ PhysicalDrive1, ...) hoặc gọi WMIC để liệt kê tất cả các ổ đĩa. [

Vì chúng có vẻ như chúng hoạt động, chúng có vẻ như chúng không phải là cách tiếp cận tốt nhất để dùng. Không có chức năng đơn giản như GetPhysicalDrives chỉ đơn giản trả về một vectơ của std::string có chứa đường dẫn của tất cả các ổ đĩa vật lý không?

+1

Bạn đã xem liệu 'boost :: filesystem' có thể giúp bạn không? – AxelOmega

+0

Tôi chưa xem xét 'tăng', không. Tôi sẽ xem xét điều đó nếu không có câu trả lời nào không yêu cầu thư viện khác không sớm xuất hiện. – hetelek

+0

Các ký tự ổ đĩa tồn tại cho các ổ đĩa logic dù được gắn hay không ... bạn vẫn có một mối quan tâm hợp lệ về đĩa vật lý mà không có ổ đĩa logic (phân vùng được nhận diện) nào cả. –

Trả lời

4

Bạn có thể sử dụng QueryDosDevice. Dựa trên mô tả, bạn mong muốn điều này liệt kê những thứ như C:D:, nhưng nó cũng sẽ liệt kê những thứ như PhysicalDrive0, PhysicalDrive1 và cứ tiếp tục như vậy.

Thiếu sót chính là nó cũng sẽ liệt kê rất nhiều tên thiết bị khác mà bạn có thể không quan tâm, vì vậy (ví dụ) trên máy của tôi, tôi nhận được danh sách gần 600 tên thiết bị, trong đó chỉ có tỷ lệ khá nhỏ có liên quan đến những gì bạn quan tâm.

Chỉ trong trường hợp bạn quan tâm, một số (cũ) mẫu mã:

#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; 
}  

Tuy nhiên, nếu tôi chạy như `devlist | grep "^ Physical", nó liệt kê các ổ đĩa vật lý.

+0

muốn điều này cho một nhiệm vụ hoàn toàn khác nhau nhưng đó là ví dụ tốt nhất tôi tìm thấy về cách sử dụng QueryDosDevice; 1 cho bạn ạ. – CommanderBubble

Các vấn đề liên quan