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).
4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 |
# File 'file.c', line 4878 static VALUE rb_stat_init(VALUE obj, VALUE fname) { struct stat st, *nst; 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
436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 |
# File 'file.c', line 436 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
845 846 847 848 849 |
# File 'file.c', line 845 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, raises NotImplementedError.
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
910 911 912 913 914 |
# File 'file.c', line 910 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
713 714 715 716 717 718 719 720 721 |
# File 'file.c', line 713 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
5036 5037 5038 5039 5040 5041 5042 5043 5044 |
# File 'file.c', line 5036 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
734 735 736 737 738 739 740 741 742 743 744 745 746 |
# File 'file.c', line 734 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
5058 5059 5060 5061 5062 5063 5064 |
# File 'file.c', line 5058 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
881 882 883 884 885 |
# File 'file.c', line 881 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
475 476 477 478 479 |
# File 'file.c', line 475 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
492 493 494 495 496 497 498 499 500 |
# File 'file.c', line 492 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
513 514 515 516 517 518 519 520 521 |
# File 'file.c', line 513 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
4950 4951 4952 4953 4954 4955 |
# File 'file.c', line 4950 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
5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 |
# File 'file.c', line 5312 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.
5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 |
# File 'file.c', line 5344 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
5379 5380 5381 5382 5383 5384 |
# File 'file.c', line 5379 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"
4933 4934 4935 4936 4937 |
# File 'file.c', line 4933 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
617 618 619 620 621 |
# File 'file.c', line 617 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
5104 5105 5106 5107 5108 5109 5110 5111 |
# File 'file.c', line 5104 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:
4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 |
# File 'file.c', line 4900 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
533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 |
# File 'file.c', line 533 static VALUE rb_stat_ino(VALUE self) { #ifdef _WIN32 struct stat *st = get_stat(self); unsigned short *p2 = (unsigned short *)st; unsigned int *p4 = (unsigned int *)st; uint64_t r; r = p2[2]; r <<= 16; r |= p2[7]; r <<= 32; r |= p4[5]; return ULL2NUM(r); #elif 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>"
934 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 |
# File 'file.c', line 934 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"
567 568 569 570 571 |
# File 'file.c', line 567 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
861 862 863 864 865 |
# File 'file.c', line 861 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
585 586 587 588 589 |
# File 'file.c', line 585 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
5078 5079 5080 5081 5082 5083 |
# File 'file.c', line 5078 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.
4965 4966 4967 4968 4969 4970 4971 4972 4973 |
# File 'file.c', line 4965 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
635 636 637 638 639 640 641 642 643 |
# File 'file.c', line 635 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
656 657 658 659 660 661 662 663 664 |
# File 'file.c', line 656 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
677 678 679 680 681 682 683 684 685 |
# File 'file.c', line 677 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
5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 |
# File 'file.c', line 5124 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
5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 |
# File 'file.c', line 5157 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
5455 5456 5457 5458 5459 5460 5461 5462 |
# File 'file.c', line 5455 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
5434 5435 5436 5437 5438 5439 5440 5441 |
# File 'file.c', line 5434 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
696 697 698 699 700 |
# File 'file.c', line 696 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
5414 5415 5416 5417 5418 5419 5420 5421 |
# File 'file.c', line 5414 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
5013 5014 5015 5016 5017 5018 5019 5020 5021 |
# File 'file.c', line 5013 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
5476 5477 5478 5479 5480 5481 5482 5483 |
# File 'file.c', line 5476 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
4992 4993 4994 4995 4996 4997 4998 4999 |
# File 'file.c', line 4992 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
601 602 603 604 605 |
# File 'file.c', line 601 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"
5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 |
# File 'file.c', line 5192 static VALUE rb_stat_wr(VALUE obj) { #ifdef S_IROTH struct stat *st = get_stat(obj); if ((st->st_mode & (S_IROTH)) == S_IROTH) { return UINT2NUM(st->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"
5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 |
# File 'file.c', line 5285 static VALUE rb_stat_ww(VALUE obj) { #ifdef S_IROTH struct stat *st = get_stat(obj); if ((st->st_mode & (S_IWOTH)) == S_IWOTH) { return UINT2NUM(st->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
5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 |
# File 'file.c', line 5217 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
5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 |
# File 'file.c', line 5250 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
5397 5398 5399 5400 5401 5402 |
# File 'file.c', line 5397 static VALUE rb_stat_z(VALUE obj) { if (get_stat(obj)->st_size == 0) return Qtrue; return Qfalse; } |