def initialize(file)
@file = file
@file_type = get_file_type(file)
@chardev = @file_type == FILE_TYPE_CHAR
case GetDriveType(file)
when DRIVE_REMOVABLE, DRIVE_CDROM, DRIVE_RAMDISK
@blockdev = true
else
@blockdev = false
end
stat_buf = [0,0,0,0,0,0,0,0,0,0,0,0,0].pack('ISSssssIIQQQQ')
if stat64(file, stat_buf) != 0
raise ArgumentError, get_last_error unless @chardev
end
@dev = stat_buf[0, 4].unpack('I').first
@ino = stat_buf[4, 2].unpack('S').first
@mode = stat_buf[6, 2].unpack('S').first
@nlink = stat_buf[8, 2].unpack('s').first
@uid = stat_buf[10, 2].unpack('s').first
@gid = stat_buf[12, 2].unpack('s').first
@rdev = stat_buf[16, 4].unpack('I').first
@size = stat_buf[24, 8].unpack('Q').first
begin
@atime = Time.at(stat_buf[32, 8].unpack('Q').first)
@mtime = Time.at(stat_buf[40, 8].unpack('Q').first)
@ctime = Time.at(stat_buf[48, 8].unpack('Q').first)
rescue
@atime = Time.at(0)
@mtime = Time.at(0)
@ctime = Time.at(0)
end
@mode = 33188 if @chardev
attr = GetFileAttributes(file)
error_num = GetLastError()
if attr == INVALID_FILE_ATTRIBUTES
unless error_num == ERROR_NOT_READY
raise ArgumentError, get_last_error(error_num)
end
end
@blksize = get_blksize(file)
case @blksize
when nil
@blocks = nil
when 0
@blocks = 0
else
@blocks = (@size.to_f / @blksize.to_f).ceil
end
@readonly = attr & FILE_ATTRIBUTE_READONLY > 0
@hidden = attr & FILE_ATTRIBUTE_HIDDEN > 0
@system = attr & FILE_ATTRIBUTE_SYSTEM > 0
@archive = attr & FILE_ATTRIBUTE_ARCHIVE > 0
@directory = attr & FILE_ATTRIBUTE_DIRECTORY > 0
@encrypted = attr & FILE_ATTRIBUTE_ENCRYPTED > 0
@normal = attr & FILE_ATTRIBUTE_NORMAL > 0
@temporary = attr & FILE_ATTRIBUTE_TEMPORARY > 0
@sparse = attr & FILE_ATTRIBUTE_SPARSE_FILE > 0
@reparse_point = attr & FILE_ATTRIBUTE_REPARSE_POINT > 0
@compressed = attr & FILE_ATTRIBUTE_COMPRESSED > 0
@offline = attr & FILE_ATTRIBUTE_OFFLINE > 0
@indexed = attr & ~FILE_ATTRIBUTE_NOT_CONTENT_INDEXED > 0
@executable = GetBinaryType(file, '')
@regular = @file_type == FILE_TYPE_DISK
@pipe = @file_type == FILE_TYPE_PIPE
@dev_major = nil
@dev_minor = nil
@grpowned = true
@owned = true
@readable = true
@readable_real = true
@rdev_major = nil
@rdev_minor = nil
@setgid = false
@setuid = false
@sticky = false
@symlink = false
@writable = true
@writable_real = true
end