Re: Directory info?

new topic     » goto parent     » topic index » view thread      » older message » newer message
just_me said...

On Windows:

GetDiskFreeSpace has a problem with disks bigger than 2gig, I modified your program to use GetDiskFreeSpaceEx
not really tested that well and output needs work to divide by 1024 or 1000 to get Gig's or Megs

--GetDiskFreeSpace 
--using the as yet unreleased eu4 
 
include std/machine.e  
include std/dll.e  
include std/get.e 
include std/console.e 
 
include std/text.e 
include "std/sequence.e" 
 
constant FREEBYTESAVAILABLETOCALLER = 1 
      , TOTALNUMBEROFBYTES  = 2 
      , TOTALNUMBEROFFREEBYTES  = 3 
 
 ,KERNEL32 = open_dll("kernel32.dll") 
 ,xGetDiskFreeSpaceExA = define_c_func(KERNEL32 
    , "GetDiskFreeSpaceExA" 
    , {C_CHAR, C_POINTER, C_POINTER, C_POINTER} 
    , C_INT) 
 
sequence sDiskSpace  
integer void 
 
--~ typedef union _ULARGE_INTEGER {   
    --~ struct { 
        --~ DWORD LowPart;  
        --~ DWORD HighPart;  
    --~ }; 
    --~ DWORDLONG QuadPart; 
--~ } ULARGE_INTEGER;  
 
 
 
public function comafy(object n, sequence mode="%f", object sep=",") 
    --could get seperator from locale? 
    --maybe should allow comafy non numerics? 
    --should allow already spaced or underlined seperated numbers? 
 
    sequence s="" 
    object so 
      
    --assumne it is an atom 
     s = sprintf(mode, n) 
      --reverse & chunk it don't add extra coma if <3 digits don't count decimal point 
      --don't get confused if locale is not using decimal point or coma 
    so= split(s, '.') 
      s = reverse(join(chunk(reverse(so[1]), 3), sep) )  
       if length(so)>1 then s &=  "." & so[2] end if 
    return s 
end function 
 
 
function GetDiskFreeSpaceExA(object xPath) 
    sequence sDiskSpace  
    atom aPath  
    atom aFreeBytesAvailableToCaller 
        , aTotalNumberOfBytes 
        , aTotalNumberOfFreeBytes 
     
    sDiskSpace = {0, 0, 0, 0} 
     
    if sequence(xPath) then aPath = allocate_string(xPath) 
    else aPath = NULL  
    end if 
     
    aFreeBytesAvailableToCaller = allocate(4) 
    aTotalNumberOfBytes = allocate(4) 
    aTotalNumberOfFreeBytes = allocate(4) 
     
    if c_func(xGetDiskFreeSpaceExA 
        , {aPath, aFreeBytesAvailableToCaller 
          , aTotalNumberOfBytes, aTotalNumberOfFreeBytes}) then 
    -- values obtained by this function are of type ULARGE_INTEGER.  
    -- Be careful not to truncate these values to 32 bits. 
     sDiskSpace[FREEBYTESAVAILABLETOCALLER] =  
               peek4s(aFreeBytesAvailableToCaller) +  
                 (#FFFFFFFF * peek4s(aFreeBytesAvailableToCaller+4)) 
     sDiskSpace[TOTALNUMBEROFBYTES] =  
               peek4s(aTotalNumberOfBytes) +   
                 (#FFFFFFFF * peek4s(aTotalNumberOfBytes+4)) 
     sDiskSpace[TOTALNUMBEROFFREEBYTES] =  
               peek4s(aTotalNumberOfFreeBytes) +   
                 (#FFFFFFFF * peek4s(aTotalNumberOfFreeBytes+4)) 
   end if 
     
    if aPath then free(aPath) end if 
     free(aFreeBytesAvailableToCaller) 
     free(aTotalNumberOfBytes) 
     free(aTotalNumberOfFreeBytes) 
     
    return sDiskSpace 
end function 
 
sequence path="C:"  --should check exists 
 
sDiskSpace = GetDiskFreeSpaceExA(path) 
 
printf(1, path &" Total: %s\nUsed: %s\nAvailable: %s\n" 
    , {comafy(sDiskSpace[TOTALNUMBEROFBYTES]) 
      , comafy( 
        sDiskSpace[TOTALNUMBEROFBYTES] - sDiskSpace[TOTALNUMBEROFFREEBYTES] 
        ) 
       , comafy(sDiskSpace[FREEBYTESAVAILABLETOCALLER]) 
       }) 
 
void = wait_key()  
 
 
new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu