C++ Builder Snippets  

"Datenträger im Laufwerk ?"-Check, Volume-Namen (Datenträgerbezeichnung), Seriennummer und Speicherplatz auf dem Datenträger ermitteln:

Folgende Funktion kann eingesetzt werden um zu überprüfen, ob sich ein Datenträger im Laufwerk befindet und ggf. die Datenträger-Bezeichnung und die -Seriennummer auszulesen - um z.B. festzustellen, ob sich die richtige Diskette/CD-Rom/ZIP-Disk im Laufwerk befindet:

Screenshot
//---------------------------------------------------------------------------
// Funktion IsDiskInDrive() überprüft, ob sich ein Datenträger im Laufwerk
// befindet und ermittelt ggf. den Volume-Namen (In Microsoft-Deutsch:
// "Datenträger-Bezeichnung") und die Seriennummer des Laufwerks
//
// Parameter:
// - AnsiString slDrive    = Lufwerksbuchstabe oder der komplette Pfad
// - AnsiString &slVolName = String in den ggf. der Volume-Name
//                           geschrieben wird
// - DWORD &dwVolumeSerial = uns. Integer in den ggf. die Seriennummer
//                           des Datenträgers geschrieben wird 
//
// Rückgabewert:
// - true  = Datenträger im Laufwerk
// - false = entsprechend das Gegenteil
//---------------------------------------------------------------------------
bool IsDiskInDrive(AnsiString slDrive, AnsiString &slVolName,
  DWORD& dwVolumeSerial)
{
  bool blRetVal = false;
  UINT iErrMode;
  TCHAR szVolName[256];
  DWORD dwMaxComSize;
  DWORD dwFlags;
  TCHAR szFS[256];

  // Falls Laufwerksname übergeben:
  if(slDrive.Length() > 0)
  {
    // der Aufruf von SetErrorMode ist notwendig, Windows-Messagebox
    // "Laufwerk nicht bereit" zu unterdrücken:
    iErrMode = SetErrorMode(SEM_FAILCRITICALERRORS);

    // Laufwerksinformationen auslesen:
    blRetVal = GetVolumeInformation(
      (slDrive.SubString(1,1)+ ":\\").c_str(),
      szVolName, sizeof(szVolName), &dwVolumeSerial,
      &dwMaxComSize, &dwFlags, szFS, sizeof(szFS));

    // ErrorMode in ursprünglichen Zustand versetzen:
    SetErrorMode(iErrMode);
  }
  else blRetVal = false;

  // Volumen-Namen in überg. String schreiben:
  slVolName = blRetVal ? AnsiString(szVolName) : EmptyStr;
  return blRetVal;
}

//---------------------------------------------------------------------------
// Funktion GetDiskSpace() liefert den Gesmtspeicherplatz des Laufwerks und
// die Grösse des auf dem Datenträger verfügbaren Speichers
//---------------------------------------------------------------------------
// Übergabeparameter:
// AnsiString slDrive    - Laufwerk als String (z.B.: "C", "D:\\" etc.)
// __int64 &ilBytesTotal - für den Gesamtspeicerplatz (Referenz)
// __int64 &ilBytesFree  - für den verfügbaren Speicher (Referenz)
//---------------------------------------------------------------------------
// Rückgabewert: true bei erfolgreicher ausführung, anderenfalls false
//---------------------------------------------------------------------------
bool GetDiskSpace(AnsiString slDrive, __int64& ilBytesTotal,
  __int64& ilBytesFree)
{
  ilBytesFree  = DiskFree(slDrive.UpperCase()[1]-0x40);
  ilBytesTotal = DiskSize(slDrive.UpperCase()[1]-0x40);
  return ilBytesFree > -1 && ilBytesTotal > -1;
}

Anwendungsbeispiel (es wird eine TDriveComboBox, ein Button und 5 Labels benötigt):
//---------------------------------------------------------------------------
// Ereignisbehandlung für Click auf Button1 und Change-Ereignis der
// DriveComboBox1
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  AnsiString slVolumeName;
  DWORD dwVolumeSerial;

  if(IsDiskInDrive(AnsiString(DriveComboBox1->Drive), slVolumeName,
    dwVolumeSerial))
  {
    // Seriennummer ausgeben:
    lblSerial -> Caption = lblSerial -> Caption.sprintf("%u", dwVolumeSerial);
    Label5 -> Caption = "Datenträger im Laufwerk !";

    // Speicherplatz-Informationen ermitteln und ausgeben:
    __int64 ilBytesTotal, ilBytesFree;

    if(GetDiskSpace(AnsiString(DriveComboBox1->Drive),
      ilBytesTotal, ilBytesFree))
    {
      // Achtung: um 64-Bit Integer zum String zu konvertieren
      // verwenden wir hier die sprintf-Methode des AnsiString,
      // da die IntToStr() einen 32-Bit-Integer erwartet:
      lblBytesTotal -> Caption =
        lblBytesTotal->Caption.sprintf("%Ld", ilBytesTotal);
      lblBytesFree -> Caption =
        lblBytesFree -> Caption.sprintf("%Ld", ilBytesFree);
    }
    else
    {
      lblBytesFree -> Caption = "Fehler aufgetreten !";
      lblBytesTotal -> Caption = "Fehler aufgetreten !";
    }
  }
  else
  {
    lblSerial -> Caption = EmptyStr;
    Label5 -> Caption = "Kein Datenträger im Laufwerk !";
    lblBytesFree -> Caption = EmptyStr;
    lblBytesTotal -> Caption = EmptyStr;
  }
  Label3 -> Caption = slVolumeName;
}


  Download BCB5
Projekt-Quellcode
Download
Demo-Exe


© '99-2001 by S. Kreutzmann