2009-05-13 4 views
8

Je construis une petite application qui me donne l'espace libre disponible sur mes disques.Par code, comment puis-je tester si un disque dur est en train de dormir sans le réveiller

Je voudrais ajouter une fonctionnalité affichant l'état du disque, s'il dort ou non par exemple. L'OS est Windows.

Comment cela peut-il être fait? Le code ne devrait pas se réveiller le disque pour savoir, bien sûr;)

Une solution en C# serait bien, mais je suppose que toute solution fera ...

Merci pour votre aide.

Répondre

6

solution C++ (appel GetDiskPowerState et il itérer sur les disques physiques jusqu'à ce qu'il n'y a pas plus):

class AutoHandle 
{ 
    HANDLE mHandle; 
public: 
    AutoHandle() : mHandle(NULL) { } 
    AutoHandle(HANDLE h) : mHandle(h) { } 

    HANDLE * operator &() 
    { 
     return &mHandle; 
    } 

    operator HANDLE() const 
    { 
     return mHandle; 
    } 

    ~AutoHandle() 
    { 
     if (mHandle && mHandle != INVALID_HANDLE_VALUE) 
      ::CloseHandle(mHandle); 
    } 
}; 


bool 
GetDiskPowerState(LPCTSTR disk, string & txt) 
{ 
    AutoHandle hFile = CreateFile(disk, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); 
    if (hFile && hFile != INVALID_HANDLE_VALUE) 
    { 
     BOOL powerState = FALSE; 
     const BOOL result = GetDevicePowerState(hFile, &powerState); 
     const DWORD err = GetLastError(); 

     if (result) 
     { 
      if (powerState) 
      { 
       txt += disk; 
       txt += " : powered up\r\n"; 
      } 
      else 
      { 
       txt += disk; 
       txt += " : sleeping\r\n"; 
      } 
      return true; 
     } 
     else 
     { 
      txt += "Cannot get drive "; 
      txt += disk; 
      txt += "status\r\n"; 
      return false; 
     } 
    } 

    return false; 
} 

string 
GetDiskPowerState() 
{ 
    string text; 
    CString driveName; 
    bool result = true; 
    for (int idx= 0; result; idx++) 
    { 
     driveName.Format("\\\\.\\PhysicalDrive%d", idx); 
     result = GetDiskPowerState(driveName, text); 
    } 
    return text; 
} 
+0

Merci, fonctionne comme un charme. – Jonx

3

Et en C# (De http://msdn.microsoft.com/en-us/library/ms704147.aspx)

// Get the power state of a harddisk 
string ReportDiskStatus() 
{ 
    string status = string.Empty; 
    bool fOn = false; 

    Assembly assembly = Assembly.GetExecutingAssembly(); 
    FileStream[] files = assembly.GetFiles(); 
    if (files.Length > 0) 
    { 
     IntPtr hFile = files[0].Handle; 
     bool result = GetDevicePowerState(hFile, out fOn); 
     if (result) 
     { 
      if (fOn) 
      { 
       status = "Disk is powered up and spinning"; 
      } 
      else 
      { 
       status = "Disk is sleeping"; 
      } 
     } 
     else 
     { 
      status = "Cannot get Disk Status"; 
     } 
     Console.WriteLine(status); 
    } 
    return status; 
} 
+0

Oui, c'est bien ... Il vous manque l'importation mais le lien vous donne tout. Merci. – Jonx