ruby--ruby/ext/dl/sample/drives.rb

71 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")
}