/*
* DiskSpace.h
* Copyright (c) 2011 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.
*/
// SOL++2000
#pragma once
#include <sol\Object.h>
#include <sol/StringConverter.h>
#include <sol/StringT.h>
//A function pointer to GetDiskFreeSpaceExA
typedef BOOL (WINAPI *DiskFreeSpaceProc)(LPCSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER );
namespace SOL {
class DiskSpace :public Object {
private:
DiskFreeSpaceProc diskSpaceProc;
HINSTANCE lib;
public:
DiskSpace()
{
diskSpaceProc = NULL;
lib = LoadLibrary(_T("kernel32.dll") );
OSVERSIONINFO verInfo;
verInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&verInfo);
if(verInfo.dwMajorVersion>4 ||
(verInfo.dwMajorVersion==4 && LOWORD(verInfo.dwBuildNumber)>=1000 ) ){
diskSpaceProc =(DiskFreeSpaceProc)GetProcAddress(lib, "GetDiskFreeSpaceExA");
}
}
public:
~DiskSpace()
{
FreeLibrary(lib);
}
public:
Boolean get(const TCHAR* path, double& free, double& total)
{
Boolean rc = True;
free = 0.0;
total = 0.0;
// If GetDiskFreeSpaceEx procedure exists, use it.
if(diskSpaceProc){
ULARGE_INTEGER fba,tb,fb;
StringT<char> cpath;
StringConverter converter;
converter.convert(path, cpath);
if((*diskSpaceProc)((const char*)cpath, &fba, &tb, &fb)) {
fba.QuadPart = Int64ShrlMod32(fba.QuadPart,20);
tb.QuadPart = Int64ShrlMod32(tb.QuadPart,20);
fb.QuadPart = Int64ShrlMod32(fb.QuadPart,20);
free = (double)fba.u.LowPart;
total = (double)tb.u.LowPart;
} else {
// Disk access error.
//Printf("Failed to access disk %s\r\n", path);
rc = False;
}
} else {
DWORD sectorsPerCluster = 0;
DWORD bytesPerSector = 0;
DWORD freeClusters = 0;
DWORD clusters = 0;
if (::GetDiskFreeSpace(path, §orsPerCluster,
&bytesPerSector, &freeClusters, &clusters)) {
//<modified date="2000.02.18">
double size = (double)sectorsPerCluster *
(double)bytesPerSector *
(double)clusters/1024.0;
double freeSize = (double)sectorsPerCluster *
(double)bytesPerSector *
(double)freeClusters/1024.0;
total = (double)size/1024.0;
free = (double)freeSize/1024.0;
//</modified>
} else {
rc = False;
// Disk access error.
//Printf("Failed to access disk %s\r\n", path);
}
}
return rc;
}
};
}
|