2008-11-13 36 views

Trả lời

13

::GetLogicalDrives() trả về danh sách các ổ đĩa sẵn có (đã đọc: đã sử dụng) dưới dạng bit trong mặt nạ. Điều này nên bao gồm các ổ đĩa mạng được ánh xạ. Vì vậy, bạn có thể chỉ cần đi bộ các bit để tìm các bit bằng 0, nghĩa là không có ổ đĩa nào. Nếu nghi ngờ, bạn luôn có thể gọi ::GetDriveType() với ký tự ổ đĩa + ":\" (":\\" trong mã C hoặc _T(":\\") trong thuật ngữ nhận thức Unicode), và điều đó sẽ trả lại DRIVE_UNKNOWN hoặc DRIVE_NO_ROOT_DIR nếu ổ đĩa khả dụng.

+0

có, điều đó dễ hơn GetLogicalDriveStrings! – Alnitak

1

GetLogicalDrives và GetLogicalDriveStrings không nhìn thấy ổ đĩa mạng được tạo trong một không gian tên khác.

Ví dụ gọi các chức năng từ một dịch vụ đang chạy trong Hệ thống cục bộ sẽ không thấy ổ đĩa mạng được tạo bởi người dùng đã đăng nhập.

Điều này đang xảy ra bắt đầu với Windows XP. Bài viết sau đây mô tả trường hợp này: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363908(v=vs.85).aspx

+0

Tại sao điều đó lại quan trọng? Bạn có thể sử dụng lại các ký tự ổ đĩa bất kể người dùng khác đã định nghĩa chúng, và câu hỏi chỉ cần sử dụng các chữ cái không sử dụng được. – SilverbackNet

3

Im không shure làm thế nào để liệt kê chúng hoặc nếu nó sẽ biên dịch trên visual C++ nhưng tôi Sturm mã này trên Dev C++ hoặc Mã Blocks để kiểm tra những gì ổ đĩa là acessible bằng cách sử dụng CreateFile và loại ổ đĩa là gì bằng cách sử dụng GetDriveType. Chương trình kiểm tra các ổ đĩa từ A đến Z:

#include <windows.h> 
#include <cstring> 
#include <sstream> 
#include <iostream> 

using namespace std; 

int __stdcall WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, INT nShowCmd) 
{ 
    HANDLE hDevice = NULL; 
    HANDLE fileFind = NULL; 
    while(true) 
    { 
     Sleep(3005); 
     char drv='A'; 
     while(drv!='[') 
     { 
      Sleep(105); 
      const char *charDrvCF; 
      const char *charDrv; 
      stringstream Str; 
      string drvStr; 
      Str<<drv; 
      Str>>drvStr; 
      string drvSpc=drvStr+":\\"; 
      string fCheck="\\\\.\\"; 
      string fhCheck=fCheck+drvStr+":"; 
      charDrvCF=fhCheck.c_str(); 
      charDrv=drvSpc.c_str();  
      hDevice=CreateFile(charDrvCF, 
           GENERIC_READ|GENERIC_WRITE, 
           FILE_SHARE_READ|FILE_SHARE_WRITE, 
           NULL, 
           OPEN_EXISTING, 
           0, 
           NULL); 
      if(hDevice!=INVALID_HANDLE_VALUE) 
      { 
       switch(GetDriveType(charDrv)) 
       { 
        case DRIVE_FIXED: 
        { 
         cout<<"Fixed drive detected: "<<charDrv<<endl; 
         break; 
        } 
        case DRIVE_REMOVABLE: 
        { 
         cout<<"Removable drive detected: "<<charDrv<<endl; 
         break; 
        } 
        case DRIVE_NO_ROOT_DIR: 
        { 
         cout<<"There is no volume mounted at the specified path. "<<charDrv<<endl; 
         break; 
        } 
        case DRIVE_REMOTE: 
        { 
         cout<<"The drive is a remote (network) drive. "<<charDrv<<endl; 
         break; 
        } 
        case DRIVE_CDROM: 
        { 
         cout<<"The drive is a CD-ROM drive. "<<charDrv<<endl; 
         break; 
        } 
        case DRIVE_RAMDISK: 
        { 
         cout<<"The drive is a RAM disk. "<<charDrv<<endl; 
         break; 
        } 
        case DRIVE_UNKNOWN: 
        { 
         cout<<"The drive type cannot be determined. "<<charDrv<<endl; 
         break; 
        } 
       } 
      } 
     drv++; 
     } 
    } 
} 
+0

quá nhiều mã lol – TheRealChx101

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