Liste aller vorhandenen Laufwerke



  • Hallo zusammen,

    ich habe ein Konsolenprogramm mit Visual C++ 6.0 geschrieben, welches auf der Grundlage einer Datei verschiedene Dinge berechnet.

    Nun möchte ich dass der Benutzer am Anfang diese Datei auswählen kann. Konkret hatte ich an eine Art Explorer im Konsolen-Stil gedacht. Ich habe soweit auch schon alles hinbekommen:

    - Liste von Ordnern in einem Verzeichnis
    - Liste von Dateien mit einer bestimmten Endung in einem Verzeichnis

    Der Benutzer kann nun durch Nummerneingabe in den Ordnern herum springen und auch das aktuelle Verzeichnis wieder verlassen.

    Mein Problem ist: Wenn der Nutzer das Laufwerk wechseln möchte, muss er zur Zeit noch den richtigen Buchstaben eingeben, ich möchte aber auch hier eine Liste, aus der man ein vorhandenes Laufwerk wählen kann, zur Verfügung stellen.

    Wie kann ich mir alle vorhandenen Laufwerke mit deren Bezeichnung ausgeben lassen?

    Vielen Dank schonmal
    Gruß Thomas



  • Mit GetLogicalDriveStrings bekommst Du eine Liste der gültigen Laufwerke. Die einzelnen Laufwerke sind jeweils nullterminiert, also "A:\\0B:\\0C:\\0\0"



  • Sieh Dir mal

    GetCurentDrive();
    GetDriveType(NULL)
    GetVolumeInformation(...)
    

    an



  • http://www.c-plusplus.net/forum/viewtopic-var-t-is-210275.html

    Normalerweise, wenn im falschen Forum gepostet wird, wird der Beitrag kurze Zeit später verschoben.
    Ich wollte nur den Hinweis geben, dass Du dich im falschen Forum befindest.



  • Also GetLogicalDriveStrings habe ich auch schon gefunden, allerdings kann ich nicht damit umgehen 😞 Mir würde es sicher helfen an einem Beispiel zu sehen wie ich denn mit cout die Laufwerksbezeichnungen auf den Bildschirm bekomme.

    ... Danke schonmal 😉

    Sieh Dir mal

    C/C++ Code:
    GetCurentDrive();
    GetDriveType(NULL)
    GetVolumeInformation(...)

    an

    Dies würde mir ja nur das aktuelle Laufwerk zurückgeben, ich brauche aber eine Liste aller Laufwerke. Trotzdem danke...



  • Alternative: GetLogicalDrives() liefert einen 32-Bit Wert, wobei ein Bitwert gleich 1 einem vorhandenen Laufwerk entspricht:
    Bit 0 (LSB) = Laufwerk A:\
    Bit 1 = Laufwerk B:\
    Bit 2 = Laufwerk C:\
    ...
    Bit 25 = Laufwerk Z:\

    Martin



  • Dies würde mir ja nur das aktuelle Laufwerk zurückgeben

    Stimmt. Du könntest aber:

    //aktuelles holen
    int curdrive= _getdrive();
    //alle durchgehen
    for(int drive = 1; drive <= 26; drive++ )	//1=ab Laufwerk a	
    {
      if( _chdrive( drive )==0 )//0=OK
      {
         iType= GetDriveType(NULL);
         if(iType==DRIVE_REMOVABLE || iType==DRIVE_CDROM...)
         {
             //...
            GetVolumeInformation(...);
            //...
         }
      }
    }
    //aktuelles zurückschreiben
    _chdrive(curdrive);
    

    alle verfügbaren Laufwerke abfragen.



  • //aktuelles holen
    int curdrive= _getdrive();
    //alle durchgehen
    for(int drive = 1; drive <= 26; drive++ )    //1=ab Laufwerk a    
    {
      if( _chdrive( drive )==0 )//0=OK
      {
         iType= GetDriveType(NULL);
         if(iType==DRIVE_REMOVABLE || iType==DRIVE_CDROM...)
         {
             //...
            GetVolumeInformation(...);
            //...
         }
      }
    }
    //aktuelles zurückschreiben
    _chdrive(curdrive);
    

    Wenn ich die Laufwerksliste auf diese Weise umsetze bekomme ich auf jeden Fall schonmal alle Laufwerke ausgegeben. Er gibt mir nur während der Ausgabe auch noch eine Warnung (MsgBox) aus:

    Exception Processing Message c0000013 Parameters 75b0f9c 4 75b0bf9c 75b0bf9c
    Abbrechen Wiederholen Weiter

    ... wenn ich auf Weiter klicke erscheinen die Laufwerke in der Konsole.
    Kann es daran liegen dass in meinem Diskettenlaufwerk (A:) kein Datenträger zu finden ist? Wie kann ich diese Meldung umgehen?
    Geht es dass nur die Laufwerke angezeigt werden, auf denen wirklich Daten vorhanden sind? Also leere Disketten- oder CD-Laufwerke ausgeschlossen werden?



  • Klammere Deinen Code mal mit

    UINT nOldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
    
    ....
    
    SetErrorMode(nOldErrorMode);
    


  • Vielen Dank,... dat geht!!!

    Aber was hab ich da jetzt eigentlich gemacht. Bitte beschreib mir nur kurz die was diese beiden Zeilen am Anfang und am Ende des Codes bewirken.

    Danke
    Gruß Thomas



  • Einfach mal in die Doku schauen. 😉



  • krug33 schrieb:

    Aber was hab ich da jetzt eigentlich gemacht. Bitte beschreib mir nur kurz die was diese beiden Zeilen am Anfang und am Ende des Codes bewirken.
    Gruß Thomas

    http://msdn2.microsoft.com/en-us/library/ms680621.aspx


Anmelden zum Antworten