Re: Directory info?
- Posted by ne1uno Sep 21, 2008
- 1070 views
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()