SOL9 2.0 Class: DiskSpace

 SOL9 C++ Class Library  SOL9 Samples  SOL9 Tutorial  SOL9 FAQ  SOL9 ClassTree 

Source code

/*
 * 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, &sectorsPerCluster, 
                &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;
    }

};

}




Last modified: 1 Feb 2012

Copyright (c) 2009-2012 Antillia.com ALL RIGHTS RESERVED.