1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/ext/dl/sample/drives.rb
ttate 7d711b817e Add ruby-dl
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2324 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-04-02 10:56:13 +00:00

70 lines
1.4 KiB
Ruby

# -*- ruby -*-
# drives.rb -- find existing drives and show the drive type.
require 'dl'
require 'dl/import'
module Kernel32
extend DL::Importable
dlload "kernel32"
extern "long GetLogicalDrives()"
extern "int GetDriveType(char*)"
extern "long GetDiskFreeSpace(char*, long ref, long ref, long ref, long ref)"
end
include Kernel32
buff = Kernel32.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",
]
print("Drive : Type (Free Space/Available Space)\n")
ds.each{|d|
t = Kernel32.getDriveType(d + ":\\")
Kernel32.getDiskFreeSpace(d + ":\\", 0, 0, 0, 0)
_,sec_per_clus,byte_per_sec,free_clus,total_clus = Kernel32._args_
fbytes = sec_per_clus * byte_per_sec * free_clus
tbytes = sec_per_clus * byte_per_sec * total_clus
unit = "B"
if( fbytes > 1024 && tbytes > 1024 )
fbytes = fbytes / 1024
tbytes = tbytes / 1024
unit = "K"
end
if( fbytes > 1024 && tbytes > 1024 )
fbytes = fbytes / 1024
tbytes = tbytes / 1024
unit = "M"
end
print("#{d} : #{types[t]} (#{fbytes} #{unit}/#{tbytes} #{unit})\n")
}