2008-11-13 24 views

Antwort

13

::GetLogicalDrives() gibt eine Liste verfügbarer (read: used) Laufwerke als Bits in einer Maske zurück. Dies sollte zugeordnete Netzlaufwerke umfassen. So können Sie die Bits einfach laufen lassen, um Bits zu finden, die Null sind, was bedeutet, dass kein Laufwerk vorhanden ist. Im Zweifelsfall können Sie immer ::GetDriveType() mit dem Laufwerksbuchstaben + ":\" (":\\" in C-Code oder _T(":\\") in Unicode-bewußter Terminologie natürlich anrufen), und das sollte DRIVE_UNKNOWN oder DRIVE_NO_ROOT_DIR zurückgeben, wenn das Laufwerk verfügbar ist.

+0

ja, das ist einfacher als GetLogicalDriveStrings! – Alnitak

1

Bei GetLogicalDrives und GetLogicalDriveStrings werden keine Netzwerklaufwerke in einem anderen Namespace erstellt.

Wenn beispielsweise die Funktionen eines unter "Lokales System" ausgeführten Dienstes aufgerufen werden, werden die von einem protokollierten Benutzer erstellten Netzlaufwerke nicht angezeigt.

Dies geschieht ab Windows XP. Der folgende Artikel beschreibt diesen Fall: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363908(v=vs.85).aspx

+0

Warum ist das wichtig? Sie können Laufwerksbuchstaben wiederverwenden, unabhängig davon, welche anderen Benutzer sie definiert haben, und die Frage benötigte nur brauchbare unbenutzte Buchstaben. – SilverbackNet

3

Im nicht sicher, wie man sie aufzählen, oder wenn es auf Visual C kompilieren ++, aber ich Sturm- codiert diese auf Dev C++ oder Codeblöcke zu überprüfen, was Laufwerk acessible ist Createfile durch die Verwendung und Welche Art von Laufwerk ist mit GetDriveType. Programm prüft Laufwerke von A bis 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

zu viel Code lol – TheRealChx101

Verwandte Themen