Class: File::Stat
Overview
Objects of class File::Stat encapsulate common status information for File objects. The information is recorded at the moment the File::Stat object is created; changes made to the file after that point will not be reflected. File::Stat objects are returned by IO#stat, File::stat, File#lstat, and File::lstat. Many of these methods return platform-specific values, and not all values are meaningful on all systems. See also Kernel#test.
Instance Method Summary collapse
-
#<=>(other_stat) ⇒ -1, ...
Compares File::Stat objects by comparing their respective modification times.
-
#atime ⇒ Time
Returns the last access time for this file as an object of class
Time. -
#birthtime ⇒ aTime
Returns the birth time for stat.
-
#blksize ⇒ Integer?
Returns the native file system’s block size.
-
#blockdev? ⇒ Boolean
Returns
trueif the file is a block device,falseif it isn’t or if the operating system doesn’t support this feature. -
#blocks ⇒ Integer?
Returns the number of native file system blocks allocated for this file, or
nilif the operating system doesn’t support this feature. -
#chardev? ⇒ Boolean
Returns
trueif the file is a character device,falseif it isn’t or if the operating system doesn’t support this feature. -
#ctime ⇒ aTime
Returns the change time for stat (that is, the time directory information about the file was changed, not the file itself).
-
#dev ⇒ Fixnum
Returns an integer representing the device on which stat resides.
-
#dev_major ⇒ Fixnum
Returns the major part of
File_Stat#devornil. -
#dev_minor ⇒ Fixnum
Returns the minor part of
File_Stat#devornil. -
#directory? ⇒ Boolean
Returns
trueif stat is a directory,falseotherwise. -
#executable? ⇒ Boolean
Returns
trueif stat is executable or if the operating system doesn’t distinguish executable files from nonexecutable files. -
#executable_real? ⇒ Boolean
Same as
executable?, but tests using the real owner of the process. -
#file? ⇒ Boolean
Returns
trueif stat is a regular file (not a device file, pipe, socket, etc.). -
#ftype ⇒ String
Identifies the type of stat.
-
#gid ⇒ Fixnum
Returns the numeric group id of the owner of stat.
-
#grpowned? ⇒ Boolean
Returns true if the effective group id of the process is the same as the group id of stat.
-
#File::Stat.new(file_name) ⇒ Object
constructor
Create a File::Stat object for the given file name (raising an exception if the file doesn’t exist).
-
#initialize_copy(orig) ⇒ Object
:nodoc:.
-
#ino ⇒ Fixnum
Returns the inode number for stat.
-
#inspect ⇒ String
Produce a nicely formatted description of stat.
-
#mode ⇒ Fixnum
Returns an integer representing the permission bits of stat.
-
#mtime ⇒ aTime
Returns the modification time of stat.
-
#nlink ⇒ Fixnum
Returns the number of hard links to stat.
-
#owned? ⇒ Boolean
Returns
trueif the effective user id of the process is the same as the owner of stat. -
#pipe? ⇒ Boolean
Returns
trueif the operating system supports pipes and stat is a pipe;falseotherwise. -
#rdev ⇒ Fixnum?
Returns an integer representing the device type on which stat resides.
-
#rdev_major ⇒ Fixnum
Returns the major part of
File_Stat#rdevornil. -
#rdev_minor ⇒ Fixnum
Returns the minor part of
File_Stat#rdevornil. -
#readable? ⇒ Boolean
Returns
trueif stat is readable by the effective user id of this process. -
#readable_real? ⇒ Boolean
Returns
trueif stat is readable by the real user id of this process. -
#setgid? ⇒ Boolean
Returns
trueif stat has the set-group-id permission bit set,falseif it doesn’t or if the operating system doesn’t support this feature. -
#setuid? ⇒ Boolean
Returns
trueif stat has the set-user-id permission bit set,falseif it doesn’t or if the operating system doesn’t support this feature. -
#size ⇒ Fixnum
Returns the size of stat in bytes.
-
#size ⇒ Integer
Returns the size of stat in bytes.
-
#socket? ⇒ Boolean
Returns
trueif stat is a socket,falseif it isn’t or if the operating system doesn’t support this feature. -
#sticky? ⇒ Boolean
Returns
trueif stat has its sticky bit set,falseif it doesn’t or if the operating system doesn’t support this feature. -
#symlink? ⇒ Boolean
Returns
trueif stat is a symbolic link,falseif it isn’t or if the operating system doesn’t support this feature. -
#uid ⇒ Fixnum
Returns the numeric user id of the owner of stat.
-
#world_readable? ⇒ Fixnum?
If stat is readable by others, returns an integer representing the file permission bits of stat.
-
#world_writable? ⇒ Fixnum?
If stat is writable by others, returns an integer representing the file permission bits of stat.
-
#writable? ⇒ Boolean
Returns
trueif stat is writable by the effective user id of this process. -
#writable_real? ⇒ Boolean
Returns
trueif stat is writable by the real user id of this process. -
#zero? ⇒ Boolean
Returns
trueif stat is a zero-length file;falseotherwise.
Methods included from Comparable
#<, #<=, #==, #>, #>=, #between?
Constructor Details
#File::Stat.new(file_name) ⇒ Object
Create a File::Stat object for the given file name (raising an exception if the file doesn’t exist).
4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 |
# File 'file.c', line 4881 static VALUE rb_stat_init(VALUE obj, VALUE fname) { struct stat st, *nst; rb_secure(2); FilePathValue(fname); fname = rb_str_encode_ospath(fname); if (STAT(StringValueCStr(fname), &st) == -1) { rb_sys_fail_path(fname); } if (DATA_PTR(obj)) { xfree(DATA_PTR(obj)); DATA_PTR(obj) = NULL; } nst = ALLOC(struct stat); *nst = st; DATA_PTR(obj) = nst; return Qnil; } |
Instance Method Details
#<=>(other_stat) ⇒ -1, ...
Compares File::Stat objects by comparing their respective modification times.
nil is returned if other_stat is not a File::Stat object
f1 = File.new("f1", "w")
sleep 1
f2 = File.new("f2", "w")
f1.stat <=> f2.stat #=> -1
449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 |
# File 'file.c', line 449 static VALUE rb_stat_cmp(VALUE self, VALUE other) { if (rb_obj_is_kind_of(other, rb_obj_class(self))) { struct timespec ts1 = stat_mtimespec(get_stat(self)); struct timespec ts2 = stat_mtimespec(get_stat(other)); if (ts1.tv_sec == ts2.tv_sec) { if (ts1.tv_nsec == ts2.tv_nsec) return INT2FIX(0); if (ts1.tv_nsec < ts2.tv_nsec) return INT2FIX(-1); return INT2FIX(1); } if (ts1.tv_sec < ts2.tv_sec) return INT2FIX(-1); return INT2FIX(1); } return Qnil; } |
#atime ⇒ Time
Returns the last access time for this file as an object of class Time.
File.stat("testfile").atime #=> Wed Dec 31 18:00:00 CST 1969
847 848 849 850 851 |
# File 'file.c', line 847 static VALUE rb_stat_atime(VALUE self) { return stat_atime(get_stat(self)); } |
#birthtime ⇒ aTime
Returns the birth time for stat. If the platform doesn’t have birthtime, returns ctime.
File.write("testfile", "foo")
sleep 10
File.write("testfile", "bar")
sleep 10
File.chmod(0644, "testfile")
sleep 10
File.read("testfile")
File.stat("testfile").birthtime #=> 2014-02-24 11:19:17 +0900
File.stat("testfile").mtime #=> 2014-02-24 11:19:27 +0900
File.stat("testfile").ctime #=> 2014-02-24 11:19:37 +0900
File.stat("testfile").atime #=> 2014-02-24 11:19:47 +0900
911 912 913 914 915 |
# File 'file.c', line 911 static VALUE rb_stat_birthtime(VALUE self) { return stat_birthtime(get_stat(self)); } |
#blksize ⇒ Integer?
Returns the native file system’s block size. Will return nil on platforms that don’t support this information.
File.stat("testfile").blksize #=> 4096
715 716 717 718 719 720 721 722 723 |
# File 'file.c', line 715 static VALUE rb_stat_blksize(VALUE self) { #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE return ULONG2NUM(get_stat(self)->st_blksize); #else return Qnil; #endif } |
#blockdev? ⇒ Boolean
Returns true if the file is a block device, false if it isn’t or if the operating system doesn’t support this feature.
File.stat("testfile").blockdev? #=> false
File.stat("/dev/hda1").blockdev? #=> true
5040 5041 5042 5043 5044 5045 5046 5047 5048 |
# File 'file.c', line 5040 static VALUE rb_stat_b(VALUE obj) { #ifdef S_ISBLK if (S_ISBLK(get_stat(obj)->st_mode)) return Qtrue; #endif return Qfalse; } |
#blocks ⇒ Integer?
Returns the number of native file system blocks allocated for this file, or nil if the operating system doesn’t support this feature.
File.stat("testfile").blocks #=> 2
736 737 738 739 740 741 742 743 744 745 746 747 748 |
# File 'file.c', line 736 static VALUE rb_stat_blocks(VALUE self) { #ifdef HAVE_STRUCT_STAT_ST_BLOCKS # if SIZEOF_STRUCT_STAT_ST_BLOCKS > SIZEOF_LONG return ULL2NUM(get_stat(self)->st_blocks); # else return ULONG2NUM(get_stat(self)->st_blocks); # endif #else return Qnil; #endif } |
#chardev? ⇒ Boolean
Returns true if the file is a character device, false if it isn’t or if the operating system doesn’t support this feature.
File.stat("/dev/tty").chardev? #=> true
5062 5063 5064 5065 5066 5067 5068 |
# File 'file.c', line 5062 static VALUE rb_stat_c(VALUE obj) { if (S_ISCHR(get_stat(obj)->st_mode)) return Qtrue; return Qfalse; } |
#ctime ⇒ aTime
Returns the change time for stat (that is, the time directory information about the file was changed, not the file itself).
Note that on Windows (NTFS), returns creation time (birth time).
File.stat("testfile").ctime #=> Wed Apr 09 08:53:14 CDT 2003
883 884 885 886 887 |
# File 'file.c', line 883 static VALUE rb_stat_ctime(VALUE self) { return stat_ctime(get_stat(self)); } |
#dev ⇒ Fixnum
Returns an integer representing the device on which stat resides.
File.stat("testfile").dev #=> 774
488 489 490 491 492 |
# File 'file.c', line 488 static VALUE rb_stat_dev(VALUE self) { return DEVT2NUM(get_stat(self)->st_dev); } |
#dev_major ⇒ Fixnum
Returns the major part of File_Stat#dev or nil.
File.stat("/dev/fd1").dev_major #=> 2
File.stat("/dev/tty").dev_major #=> 5
505 506 507 508 509 510 511 512 513 |
# File 'file.c', line 505 static VALUE rb_stat_dev_major(VALUE self) { #if defined(major) return INT2NUM(major(get_stat(self)->st_dev)); #else return Qnil; #endif } |
#dev_minor ⇒ Fixnum
Returns the minor part of File_Stat#dev or nil.
File.stat("/dev/fd1").dev_minor #=> 1
File.stat("/dev/tty").dev_minor #=> 0
526 527 528 529 530 531 532 533 534 |
# File 'file.c', line 526 static VALUE rb_stat_dev_minor(VALUE self) { #if defined(minor) return INT2NUM(minor(get_stat(self)->st_dev)); #else return Qnil; #endif } |
#directory? ⇒ Boolean
Returns true if stat is a directory, false otherwise.
File.stat("testfile").directory? #=> false
File.stat(".").directory? #=> true
4954 4955 4956 4957 4958 4959 |
# File 'file.c', line 4954 static VALUE rb_stat_d(VALUE obj) { if (S_ISDIR(get_stat(obj)->st_mode)) return Qtrue; return Qfalse; } |
#executable? ⇒ Boolean
Returns true if stat is executable or if the operating system doesn’t distinguish executable files from nonexecutable files. The tests are made using the effective owner of the process.
File.stat("testfile").executable? #=> false
5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 |
# File 'file.c', line 5314 static VALUE rb_stat_x(VALUE obj) { struct stat *st = get_stat(obj); #ifdef USE_GETEUID if (geteuid() == 0) { return st->st_mode & S_IXUGO ? Qtrue : Qfalse; } #endif #ifdef S_IXUSR if (rb_stat_owned(obj)) return st->st_mode & S_IXUSR ? Qtrue : Qfalse; #endif #ifdef S_IXGRP if (rb_stat_grpowned(obj)) return st->st_mode & S_IXGRP ? Qtrue : Qfalse; #endif #ifdef S_IXOTH if (!(st->st_mode & S_IXOTH)) return Qfalse; #endif return Qtrue; } |
#executable_real? ⇒ Boolean
Same as executable?, but tests using the real owner of the process.
5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 |
# File 'file.c', line 5346 static VALUE rb_stat_X(VALUE obj) { struct stat *st = get_stat(obj); #ifdef USE_GETEUID if (getuid() == 0) { return st->st_mode & S_IXUGO ? Qtrue : Qfalse; } #endif #ifdef S_IXUSR if (rb_stat_rowned(obj)) return st->st_mode & S_IXUSR ? Qtrue : Qfalse; #endif #ifdef S_IXGRP if (rb_group_member(get_stat(obj)->st_gid)) return st->st_mode & S_IXGRP ? Qtrue : Qfalse; #endif #ifdef S_IXOTH if (!(st->st_mode & S_IXOTH)) return Qfalse; #endif return Qtrue; } |
#file? ⇒ Boolean
Returns true if stat is a regular file (not a device file, pipe, socket, etc.).
File.stat("testfile").file? #=> true
5381 5382 5383 5384 5385 5386 |
# File 'file.c', line 5381 static VALUE rb_stat_f(VALUE obj) { if (S_ISREG(get_stat(obj)->st_mode)) return Qtrue; return Qfalse; } |
#ftype ⇒ String
Identifies the type of stat. The return string is one of: “file”, “directory”, “characterSpecial”, “blockSpecial”, “fifo”, “link”, “socket”, or “unknown”.
File.stat("/dev/tty").ftype #=> "characterSpecial"
4937 4938 4939 4940 4941 |
# File 'file.c', line 4937 static VALUE rb_stat_ftype(VALUE obj) { return rb_file_ftype(get_stat(obj)); } |
#gid ⇒ Fixnum
Returns the numeric group id of the owner of stat.
File.stat("testfile").gid #=> 500
619 620 621 622 623 |
# File 'file.c', line 619 static VALUE rb_stat_gid(VALUE self) { return GIDT2NUM(get_stat(self)->st_gid); } |
#grpowned? ⇒ Boolean
Returns true if the effective group id of the process is the same as the group id of stat. On Windows NT, returns false.
File.stat("testfile").grpowned? #=> true
File.stat("/etc/passwd").grpowned? #=> false
5108 5109 5110 5111 5112 5113 5114 5115 |
# File 'file.c', line 5108 static VALUE rb_stat_grpowned(VALUE obj) { #ifndef _WIN32 if (rb_group_member(get_stat(obj)->st_gid)) return Qtrue; #endif return Qfalse; } |
#initialize_copy(orig) ⇒ Object
:nodoc:
4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 |
# File 'file.c', line 4904 static VALUE rb_stat_init_copy(VALUE copy, VALUE orig) { struct stat *nst; if (!OBJ_INIT_COPY(copy, orig)) return copy; if (DATA_PTR(copy)) { xfree(DATA_PTR(copy)); DATA_PTR(copy) = 0; } if (DATA_PTR(orig)) { nst = ALLOC(struct stat); *nst = *(struct stat*)DATA_PTR(orig); DATA_PTR(copy) = nst; } return copy; } |
#ino ⇒ Fixnum
Returns the inode number for stat.
File.stat("testfile").ino #=> 1083669
546 547 548 549 550 551 552 553 554 |
# File 'file.c', line 546 static VALUE rb_stat_ino(VALUE self) { #if SIZEOF_STRUCT_STAT_ST_INO > SIZEOF_LONG return ULL2NUM(get_stat(self)->st_ino); #else return ULONG2NUM(get_stat(self)->st_ino); #endif } |
#inspect ⇒ String
Produce a nicely formatted description of stat.
File.stat("/etc/passwd").inspect
#=> "#<File::Stat dev=0xe000005, ino=1078078, mode=0100644,
# nlink=1, uid=0, gid=0, rdev=0x0, size=1374, blksize=4096,
# blocks=8, atime=Wed Dec 10 10:16:12 CST 2003,
# mtime=Fri Sep 12 15:41:41 CDT 2003,
# ctime=Mon Oct 27 11:20:27 CST 2003,
# birthtime=Mon Aug 04 08:13:49 CDT 2003>"
935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 |
# File 'file.c', line 935 static VALUE rb_stat_inspect(VALUE self) { VALUE str; size_t i; static const struct { const char *name; VALUE (*func)(VALUE); } member[] = { {"dev", rb_stat_dev}, {"ino", rb_stat_ino}, {"mode", rb_stat_mode}, {"nlink", rb_stat_nlink}, {"uid", rb_stat_uid}, {"gid", rb_stat_gid}, {"rdev", rb_stat_rdev}, {"size", rb_stat_size}, {"blksize", rb_stat_blksize}, {"blocks", rb_stat_blocks}, {"atime", rb_stat_atime}, {"mtime", rb_stat_mtime}, {"ctime", rb_stat_ctime}, #if defined(HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC) {"birthtime", rb_stat_birthtime}, #endif }; struct stat* st; TypedData_Get_Struct(self, struct stat, &stat_data_type, st); if (!st) { return rb_sprintf("#<%s: uninitialized>", rb_obj_classname(self)); } str = rb_str_buf_new2("#<"); rb_str_buf_cat2(str, rb_obj_classname(self)); rb_str_buf_cat2(str, " "); for (i = 0; i < sizeof(member)/sizeof(member[0]); i++) { VALUE v; if (i > 0) { rb_str_buf_cat2(str, ", "); } rb_str_buf_cat2(str, member[i].name); rb_str_buf_cat2(str, "="); v = (*member[i].func)(self); if (i == 2) { /* mode */ rb_str_catf(str, "0%lo", (unsigned long)NUM2ULONG(v)); } else if (i == 0 || i == 6) { /* dev/rdev */ rb_str_catf(str, "0x%"PRI_DEVT_PREFIX"x", NUM2DEVT(v)); } else { rb_str_append(str, rb_inspect(v)); } } rb_str_buf_cat2(str, ">"); OBJ_INFECT(str, self); return str; } |
#mode ⇒ Fixnum
Returns an integer representing the permission bits of stat. The meaning of the bits is platform dependent; on Unix systems, see stat(2).
File.chmod(0644, "testfile") #=> 1
s = File.stat("testfile")
sprintf("%o", s.mode) #=> "100644"
569 570 571 572 573 |
# File 'file.c', line 569 static VALUE rb_stat_mode(VALUE self) { return UINT2NUM(ST2UINT(get_stat(self)->st_mode)); } |
#mtime ⇒ aTime
Returns the modification time of stat.
File.stat("testfile").mtime #=> Wed Apr 09 08:53:14 CDT 2003
863 864 865 866 867 |
# File 'file.c', line 863 static VALUE rb_stat_mtime(VALUE self) { return stat_mtime(get_stat(self)); } |
#nlink ⇒ Fixnum
Returns the number of hard links to stat.
File.stat("testfile").nlink #=> 1
File.link("testfile", "testfile.bak") #=> 0
File.stat("testfile").nlink #=> 2
587 588 589 590 591 |
# File 'file.c', line 587 static VALUE rb_stat_nlink(VALUE self) { return UINT2NUM(get_stat(self)->st_nlink); } |
#owned? ⇒ Boolean
Returns true if the effective user id of the process is the same as the owner of stat.
File.stat("testfile").owned? #=> true
File.stat("/etc/passwd").owned? #=> false
5082 5083 5084 5085 5086 5087 |
# File 'file.c', line 5082 static VALUE rb_stat_owned(VALUE obj) { if (get_stat(obj)->st_uid == geteuid()) return Qtrue; return Qfalse; } |
#pipe? ⇒ Boolean
Returns true if the operating system supports pipes and stat is a pipe; false otherwise.
4969 4970 4971 4972 4973 4974 4975 4976 4977 |
# File 'file.c', line 4969 static VALUE rb_stat_p(VALUE obj) { #ifdef S_IFIFO if (S_ISFIFO(get_stat(obj)->st_mode)) return Qtrue; #endif return Qfalse; } |
#rdev ⇒ Fixnum?
Returns an integer representing the device type on which stat resides. Returns nil if the operating system doesn’t support this feature.
File.stat("/dev/fd1").rdev #=> 513
File.stat("/dev/tty").rdev #=> 1280
637 638 639 640 641 642 643 644 645 |
# File 'file.c', line 637 static VALUE rb_stat_rdev(VALUE self) { #ifdef HAVE_STRUCT_STAT_ST_RDEV return DEVT2NUM(get_stat(self)->st_rdev); #else return Qnil; #endif } |
#rdev_major ⇒ Fixnum
Returns the major part of File_Stat#rdev or nil.
File.stat("/dev/fd1").rdev_major #=> 2
File.stat("/dev/tty").rdev_major #=> 5
658 659 660 661 662 663 664 665 666 |
# File 'file.c', line 658 static VALUE rb_stat_rdev_major(VALUE self) { #if defined(HAVE_STRUCT_STAT_ST_RDEV) && defined(major) return DEVT2NUM(major(get_stat(self)->st_rdev)); #else return Qnil; #endif } |
#rdev_minor ⇒ Fixnum
Returns the minor part of File_Stat#rdev or nil.
File.stat("/dev/fd1").rdev_minor #=> 1
File.stat("/dev/tty").rdev_minor #=> 0
679 680 681 682 683 684 685 686 687 |
# File 'file.c', line 679 static VALUE rb_stat_rdev_minor(VALUE self) { #if defined(HAVE_STRUCT_STAT_ST_RDEV) && defined(minor) return DEVT2NUM(minor(get_stat(self)->st_rdev)); #else return Qnil; #endif } |
#readable? ⇒ Boolean
Returns true if stat is readable by the effective user id of this process.
File.stat("testfile").readable? #=> true
5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 |
# File 'file.c', line 5128 static VALUE rb_stat_r(VALUE obj) { struct stat *st = get_stat(obj); #ifdef USE_GETEUID if (geteuid() == 0) return Qtrue; #endif #ifdef S_IRUSR if (rb_stat_owned(obj)) return st->st_mode & S_IRUSR ? Qtrue : Qfalse; #endif #ifdef S_IRGRP if (rb_stat_grpowned(obj)) return st->st_mode & S_IRGRP ? Qtrue : Qfalse; #endif #ifdef S_IROTH if (!(st->st_mode & S_IROTH)) return Qfalse; #endif return Qtrue; } |
#readable_real? ⇒ Boolean
Returns true if stat is readable by the real user id of this process.
File.stat("testfile").readable_real? #=> true
5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 |
# File 'file.c', line 5161 static VALUE rb_stat_R(VALUE obj) { struct stat *st = get_stat(obj); #ifdef USE_GETEUID if (getuid() == 0) return Qtrue; #endif #ifdef S_IRUSR if (rb_stat_rowned(obj)) return st->st_mode & S_IRUSR ? Qtrue : Qfalse; #endif #ifdef S_IRGRP if (rb_group_member(get_stat(obj)->st_gid)) return st->st_mode & S_IRGRP ? Qtrue : Qfalse; #endif #ifdef S_IROTH if (!(st->st_mode & S_IROTH)) return Qfalse; #endif return Qtrue; } |
#setgid? ⇒ Boolean
Returns true if stat has the set-group-id permission bit set, false if it doesn’t or if the operating system doesn’t support this feature.
File.stat("/usr/sbin/lpc").setgid? #=> true
5457 5458 5459 5460 5461 5462 5463 5464 |
# File 'file.c', line 5457 static VALUE rb_stat_sgid(VALUE obj) { #ifdef S_ISGID if (get_stat(obj)->st_mode & S_ISGID) return Qtrue; #endif return Qfalse; } |
#setuid? ⇒ Boolean
Returns true if stat has the set-user-id permission bit set, false if it doesn’t or if the operating system doesn’t support this feature.
File.stat("/bin/su").setuid? #=> true
5436 5437 5438 5439 5440 5441 5442 5443 |
# File 'file.c', line 5436 static VALUE rb_stat_suid(VALUE obj) { #ifdef S_ISUID if (get_stat(obj)->st_mode & S_ISUID) return Qtrue; #endif return Qfalse; } |
#size ⇒ Fixnum
Returns the size of stat in bytes.
File.stat("testfile").size #=> 66
698 699 700 701 702 |
# File 'file.c', line 698 static VALUE rb_stat_size(VALUE self) { return OFFT2NUM(get_stat(self)->st_size); } |
#size ⇒ Integer
Returns the size of stat in bytes.
File.stat("testfile").size #=> 66
5416 5417 5418 5419 5420 5421 5422 5423 |
# File 'file.c', line 5416 static VALUE rb_stat_s(VALUE obj) { off_t size = get_stat(obj)->st_size; if (size == 0) return Qnil; return OFFT2NUM(size); } |
#socket? ⇒ Boolean
Returns true if stat is a socket, false if it isn’t or if the operating system doesn’t support this feature.
File.stat("testfile").socket? #=> false
5017 5018 5019 5020 5021 5022 5023 5024 5025 |
# File 'file.c', line 5017 static VALUE rb_stat_S(VALUE obj) { #ifdef S_ISSOCK if (S_ISSOCK(get_stat(obj)->st_mode)) return Qtrue; #endif return Qfalse; } |
#sticky? ⇒ Boolean
Returns true if stat has its sticky bit set, false if it doesn’t or if the operating system doesn’t support this feature.
File.stat("testfile").sticky? #=> false
5478 5479 5480 5481 5482 5483 5484 5485 |
# File 'file.c', line 5478 static VALUE rb_stat_sticky(VALUE obj) { #ifdef S_ISVTX if (get_stat(obj)->st_mode & S_ISVTX) return Qtrue; #endif return Qfalse; } |
#symlink? ⇒ Boolean
Returns true if stat is a symbolic link, false if it isn’t or if the operating system doesn’t support this feature. As File::stat automatically follows symbolic links, symlink? will always be false for an object returned by File::stat.
File.symlink("testfile", "alink") #=> 0
File.stat("alink").symlink? #=> false
File.lstat("alink").symlink? #=> true
4996 4997 4998 4999 5000 5001 5002 5003 |
# File 'file.c', line 4996 static VALUE rb_stat_l(VALUE obj) { #ifdef S_ISLNK if (S_ISLNK(get_stat(obj)->st_mode)) return Qtrue; #endif return Qfalse; } |
#uid ⇒ Fixnum
Returns the numeric user id of the owner of stat.
File.stat("testfile").uid #=> 501
603 604 605 606 607 |
# File 'file.c', line 603 static VALUE rb_stat_uid(VALUE self) { return UIDT2NUM(get_stat(self)->st_uid); } |
#world_readable? ⇒ Fixnum?
If stat is readable by others, returns an integer representing the file permission bits of stat. Returns nil otherwise. The meaning of the bits is platform dependent; on Unix systems, see stat(2).
m = File.stat("/etc/passwd").world_readable? #=> 420
sprintf("%o", m) #=> "644"
5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 |
# File 'file.c', line 5196 static VALUE rb_stat_wr(VALUE obj) { #ifdef S_IROTH if ((get_stat(obj)->st_mode & (S_IROTH)) == S_IROTH) { return UINT2NUM(get_stat(obj)->st_mode & (S_IRUGO|S_IWUGO|S_IXUGO)); } else { return Qnil; } #endif } |
#world_writable? ⇒ Fixnum?
If stat is writable by others, returns an integer representing the file permission bits of stat. Returns nil otherwise. The meaning of the bits is platform dependent; on Unix systems, see stat(2).
m = File.stat("/tmp").world_writable? #=> 511
sprintf("%o", m) #=> "777"
5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 |
# File 'file.c', line 5288 static VALUE rb_stat_ww(VALUE obj) { #ifdef S_IROTH if ((get_stat(obj)->st_mode & (S_IWOTH)) == S_IWOTH) { return UINT2NUM(get_stat(obj)->st_mode & (S_IRUGO|S_IWUGO|S_IXUGO)); } else { return Qnil; } #endif } |
#writable? ⇒ Boolean
Returns true if stat is writable by the effective user id of this process.
File.stat("testfile").writable? #=> true
5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 |
# File 'file.c', line 5220 static VALUE rb_stat_w(VALUE obj) { struct stat *st = get_stat(obj); #ifdef USE_GETEUID if (geteuid() == 0) return Qtrue; #endif #ifdef S_IWUSR if (rb_stat_owned(obj)) return st->st_mode & S_IWUSR ? Qtrue : Qfalse; #endif #ifdef S_IWGRP if (rb_stat_grpowned(obj)) return st->st_mode & S_IWGRP ? Qtrue : Qfalse; #endif #ifdef S_IWOTH if (!(st->st_mode & S_IWOTH)) return Qfalse; #endif return Qtrue; } |
#writable_real? ⇒ Boolean
Returns true if stat is writable by the real user id of this process.
File.stat("testfile").writable_real? #=> true
5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 |
# File 'file.c', line 5253 static VALUE rb_stat_W(VALUE obj) { struct stat *st = get_stat(obj); #ifdef USE_GETEUID if (getuid() == 0) return Qtrue; #endif #ifdef S_IWUSR if (rb_stat_rowned(obj)) return st->st_mode & S_IWUSR ? Qtrue : Qfalse; #endif #ifdef S_IWGRP if (rb_group_member(get_stat(obj)->st_gid)) return st->st_mode & S_IWGRP ? Qtrue : Qfalse; #endif #ifdef S_IWOTH if (!(st->st_mode & S_IWOTH)) return Qfalse; #endif return Qtrue; } |
#zero? ⇒ Boolean
Returns true if stat is a zero-length file; false otherwise.
File.stat("testfile").zero? #=> false
5399 5400 5401 5402 5403 5404 |
# File 'file.c', line 5399 static VALUE rb_stat_z(VALUE obj) { if (get_stat(obj)->st_size == 0) return Qtrue; return Qfalse; } |