From: Takaaki Tateishi Date: 2002-01-01T10:33:40+09:00 Subject: [ruby-talk:29923] Re: How to check free diskspace? At Tue, 1 Jan 2002 06:23:23 +0900, Le Wang wrote: > I've checked "Programming Ruby", and searched the ML to no avail. So > how do you check free disk space, other than to parse 'df' output? If we use quota file system, we can check current usage of certain user using Ruby/Quota. http://www.ruby-lang.org/en/raa-list.rhtml?name=Ruby%2FQuota On windows, we can call GetDiskFreeSpaceA() using Win32API or Ruby/DL module like this: require 'dl' module Kernel32 Kernel32 = DL.dlopen("kernel32") SYM = { :getLogicalDrives => Kernel32['GetLogicalDrives','L'], :getDriveType => Kernel32['GetDriveTypeA','IS'], :getDiskFreeSpace => Kernel32['GetDiskFreeSpaceA','LSllll'], } def getLogicalDrives() buff,_ = SYM[:getLogicalDrives][] return buff end def getDriveType(str) ty,_ = SYM[:getDriveType][str] return ty end def getDiskFreeSpace(str) err,args = SYM[:getDiskFreeSpace][str, 0, 0, 0, 0] str,sec_per_clus,byte_per_sec,free_clus,total_clus = *args return [sec_per_clus,byte_per_sec,free_clus,total_clus] end end include Kernel32 buff = getLogicalDrives() i = 0 ds = [] while( i < 26 ) mask = (1 << i) if( buff & mask > 0 ) ds.push((65+i).chr) end i += 1 end =begin From the cygwin's /usr/include/w32api/winbase.h: #define DRIVE_UNKNOWN 0 #define DRIVE_NO_ROOT_DIR 1 #define DRIVE_REMOVABLE 2 #define DRIVE_FIXED 3 #define DRIVE_REMOTE 4 #define DRIVE_CDROM 5 #define DRIVE_RAMDISK 6 =end types = [ "unknown", "no root dir", "Removable", "Fixed", "Remote", "CDROM", "RAM", ] ds.each{|d| t = getDriveType(d + ":\\") sec_per_clus,byte_per_sec,free_clus,total_clus = getDiskFreeSpace(d + ":\\") fbytes = sec_per_clus * byte_per_sec * free_clus tbytes = sec_per_clus * byte_per_sec * total_clus print("#{d} : #{types[t]} (#{fbytes}B/#{tbytes}B)\n") } -- Takaaki Tateishi