mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
71 lines
1.4 KiB
Ruby
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")
|
||
|
}
|