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 ⇒ Time
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 ⇒ Time
Returns the change time for stat (that is, the time directory information about the file was changed, not the file itself).
-
#dev ⇒ Integer
Returns an integer representing the device on which stat resides.
-
#dev_major ⇒ Integer
Returns the major part of
File_Stat#devornil. -
#dev_minor ⇒ Integer
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 ⇒ Integer
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 ⇒ Integer
Returns the inode number for stat.
-
#inspect ⇒ String
Produce a nicely formatted description of stat.
-
#mode ⇒ Integer
Returns an integer representing the permission bits of stat.
-
#mtime ⇒ Time
Returns the modification time of stat.
-
#nlink ⇒ Integer
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 ⇒ Integer?
Returns an integer representing the device type on which stat resides.
-
#rdev_major ⇒ Integer
Returns the major part of
File_Stat#rdevornil. -
#rdev_minor ⇒ Integer
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 ⇒ Integer
Returns the size of stat in bytes.
-
#size? ⇒ Integer?
Returns
nilif stat is a zero-length file, the size of the file otherwise. -
#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 ⇒ Integer
Returns the numeric user id of the owner of stat.
-
#world_readable? ⇒ Integer?
If stat is readable by others, returns an integer representing the file permission bits of stat.
-
#world_writable? ⇒ Integer?
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?, #clamp
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).
5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 |
# File 'file.c', line 5586 static VALUE rb_stat_init(VALUE obj, VALUE fname) { struct stat st; FilePathValue(fname); fname = rb_str_encode_ospath(fname); if (STAT(StringValueCStr(fname), &st) == -1) { rb_sys_fail_path(fname); } struct rb_stat *rb_st; TypedData_Get_Struct(obj, struct rb_stat, &stat_data_type, rb_st); rb_st->stat = st; rb_st->initialized = true; 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
545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 |
# File 'file.c', line 545 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
980 981 982 983 984 |
# File 'file.c', line 980 static VALUE rb_stat_atime(VALUE self) { return stat_atime(get_stat(self)); } |
#birthtime ⇒ Time
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
1045 1046 1047 1048 1049 |
# File 'file.c', line 1045 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
843 844 845 846 847 848 849 850 851 |
# File 'file.c', line 843 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
5738 5739 5740 5741 5742 5743 5744 5745 5746 |
# File 'file.c', line 5738 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
864 865 866 867 868 869 870 871 872 873 874 875 876 |
# File 'file.c', line 864 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
5760 5761 5762 5763 5764 5765 5766 |
# File 'file.c', line 5760 static VALUE rb_stat_c(VALUE obj) { if (S_ISCHR(get_stat(obj)->st_mode)) return Qtrue; return Qfalse; } |
#ctime ⇒ Time
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
1016 1017 1018 1019 1020 |
# File 'file.c', line 1016 static VALUE rb_stat_ctime(VALUE self) { return stat_ctime(get_stat(self)); } |
#dev ⇒ Integer
Returns an integer representing the device on which stat resides.
File.stat("testfile").dev #=> 774
584 585 586 587 588 589 590 591 592 593 594 |
# File 'file.c', line 584 static VALUE rb_stat_dev(VALUE self) { #if SIZEOF_STRUCT_STAT_ST_DEV <= SIZEOF_DEV_T return DEVT2NUM(get_stat(self)->st_dev); #elif SIZEOF_STRUCT_STAT_ST_DEV <= SIZEOF_LONG return ULONG2NUM(get_stat(self)->st_dev); #else return ULL2NUM(get_stat(self)->st_dev); #endif } |
#dev_major ⇒ Integer
Returns the major part of File_Stat#dev or nil.
File.stat("/dev/fd1").dev_major #=> 2
File.stat("/dev/tty").dev_major #=> 5
607 608 609 610 611 612 613 614 615 |
# File 'file.c', line 607 static VALUE rb_stat_dev_major(VALUE self) { #if defined(major) return UINT2NUM(major(get_stat(self)->st_dev)); #else return Qnil; #endif } |
#dev_minor ⇒ Integer
Returns the minor part of File_Stat#dev or nil.
File.stat("/dev/fd1").dev_minor #=> 1
File.stat("/dev/tty").dev_minor #=> 0
628 629 630 631 632 633 634 635 636 |
# File 'file.c', line 628 static VALUE rb_stat_dev_minor(VALUE self) { #if defined(minor) return UINT2NUM(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
5653 5654 5655 5656 5657 5658 |
# File 'file.c', line 5653 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
6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 |
# File 'file.c', line 6010 static VALUE rb_stat_x(VALUE obj) { struct stat *st = get_stat(obj); #ifdef USE_GETEUID if (geteuid() == 0) { return RBOOL(st->st_mode & S_IXUGO); } #endif #ifdef S_IXUSR if (rb_stat_owned(obj)) return RBOOL(st->st_mode & S_IXUSR); #endif #ifdef S_IXGRP if (rb_stat_grpowned(obj)) return RBOOL(st->st_mode & S_IXGRP); #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.
6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 |
# File 'file.c', line 6042 static VALUE rb_stat_X(VALUE obj) { struct stat *st = get_stat(obj); #ifdef USE_GETEUID if (getuid() == 0) { return RBOOL(st->st_mode & S_IXUGO); } #endif #ifdef S_IXUSR if (rb_stat_rowned(obj)) return RBOOL(st->st_mode & S_IXUSR); #endif #ifdef S_IXGRP if (rb_group_member(get_stat(obj)->st_gid)) return RBOOL(st->st_mode & S_IXGRP); #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
6077 6078 6079 6080 6081 6082 |
# File 'file.c', line 6077 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"
5636 5637 5638 5639 5640 |
# File 'file.c', line 5636 static VALUE rb_stat_ftype(VALUE obj) { return rb_file_ftype(get_stat(obj)); } |
#gid ⇒ Integer
Returns the numeric group id of the owner of stat.
File.stat("testfile").gid #=> 500
741 742 743 744 745 |
# File 'file.c', line 741 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, returns false.
File.stat("testfile").grpowned? #=> true
File.stat("/etc/passwd").grpowned? #=> false
5806 5807 5808 5809 5810 5811 5812 5813 |
# File 'file.c', line 5806 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:
5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 |
# File 'file.c', line 5607 static VALUE rb_stat_init_copy(VALUE copy, VALUE orig) { if (!OBJ_INIT_COPY(copy, orig)) return copy; struct rb_stat *orig_rb_st; TypedData_Get_Struct(orig, struct rb_stat, &stat_data_type, orig_rb_st); struct rb_stat *copy_rb_st; TypedData_Get_Struct(copy, struct rb_stat, &stat_data_type, copy_rb_st); *copy_rb_st = *orig_rb_st; return copy; } |
#ino ⇒ Integer
Returns the inode number for stat.
File.stat("testfile").ino #=> 1083669
648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 |
# File 'file.c', line 648 static VALUE rb_stat_ino(VALUE self) { #ifdef HAVE_STRUCT_STAT_ST_INOHIGH /* assume INTEGER_PACK_LSWORD_FIRST and st_inohigh is just next of st_ino */ return rb_integer_unpack(&get_stat(self)->st_ino, 2, SIZEOF_STRUCT_STAT_ST_INO, 0, INTEGER_PACK_LSWORD_FIRST|INTEGER_PACK_NATIVE_BYTE_ORDER| INTEGER_PACK_2COMP); #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>"
1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 |
# File 'file.c', line 1069 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 rb_stat* rb_st; TypedData_Get_Struct(self, struct rb_stat, &stat_data_type, rb_st); if (!rb_st->initialized) { 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, ">"); return str; } |
#mode ⇒ Integer
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"
677 678 679 680 681 |
# File 'file.c', line 677 static VALUE rb_stat_mode(VALUE self) { return UINT2NUM(ST2UINT(get_stat(self)->st_mode)); } |
#mtime ⇒ Time
Returns the modification time of stat.
File.stat("testfile").mtime #=> Wed Apr 09 08:53:14 CDT 2003
996 997 998 999 1000 |
# File 'file.c', line 996 static VALUE rb_stat_mtime(VALUE self) { return stat_mtime(get_stat(self)); } |
#nlink ⇒ Integer
Returns the number of hard links to stat.
File.stat("testfile").nlink #=> 1
File.link("testfile", "testfile.bak") #=> 0
File.stat("testfile").nlink #=> 2
695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 |
# File 'file.c', line 695 static VALUE rb_stat_nlink(VALUE self) { /* struct stat::st_nlink is nlink_t in POSIX. Not the case for Windows. */ const struct stat *ptr = get_stat(self); if (sizeof(ptr->st_nlink) <= sizeof(int)) { return UINT2NUM((unsigned)ptr->st_nlink); } else if (sizeof(ptr->st_nlink) == sizeof(long)) { return ULONG2NUM((unsigned long)ptr->st_nlink); } else if (sizeof(ptr->st_nlink) == sizeof(LONG_LONG)) { return ULL2NUM((unsigned LONG_LONG)ptr->st_nlink); } else { rb_bug(":FIXME: don't know what to do"); } } |
#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
5780 5781 5782 5783 5784 5785 |
# File 'file.c', line 5780 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.
5668 5669 5670 5671 5672 5673 5674 5675 5676 |
# File 'file.c', line 5668 static VALUE rb_stat_p(VALUE obj) { #ifdef S_IFIFO if (S_ISFIFO(get_stat(obj)->st_mode)) return Qtrue; #endif return Qfalse; } |
#rdev ⇒ Integer?
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
759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 |
# File 'file.c', line 759 static VALUE rb_stat_rdev(VALUE self) { #ifdef HAVE_STRUCT_STAT_ST_RDEV # if SIZEOF_STRUCT_STAT_ST_RDEV <= SIZEOF_DEV_T return DEVT2NUM(get_stat(self)->st_rdev); # elif SIZEOF_STRUCT_STAT_ST_RDEV <= SIZEOF_LONG return ULONG2NUM(get_stat(self)->st_rdev); # else return ULL2NUM(get_stat(self)->st_rdev); # endif #else return Qnil; #endif } |
#rdev_major ⇒ Integer
Returns the major part of File_Stat#rdev or nil.
File.stat("/dev/fd1").rdev_major #=> 2
File.stat("/dev/tty").rdev_major #=> 5
786 787 788 789 790 791 792 793 794 |
# File 'file.c', line 786 static VALUE rb_stat_rdev_major(VALUE self) { #if defined(HAVE_STRUCT_STAT_ST_RDEV) && defined(major) return UINT2NUM(major(get_stat(self)->st_rdev)); #else return Qnil; #endif } |
#rdev_minor ⇒ Integer
Returns the minor part of File_Stat#rdev or nil.
File.stat("/dev/fd1").rdev_minor #=> 1
File.stat("/dev/tty").rdev_minor #=> 0
807 808 809 810 811 812 813 814 815 |
# File 'file.c', line 807 static VALUE rb_stat_rdev_minor(VALUE self) { #if defined(HAVE_STRUCT_STAT_ST_RDEV) && defined(minor) return UINT2NUM(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
5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 |
# File 'file.c', line 5826 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 RBOOL(st->st_mode & S_IRUSR); #endif #ifdef S_IRGRP if (rb_stat_grpowned(obj)) return RBOOL(st->st_mode & S_IRGRP); #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
5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 |
# File 'file.c', line 5859 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 RBOOL(st->st_mode & S_IRUSR); #endif #ifdef S_IRGRP if (rb_group_member(get_stat(obj)->st_gid)) return RBOOL(st->st_mode & S_IRGRP); #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
6155 6156 6157 6158 6159 6160 6161 6162 |
# File 'file.c', line 6155 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
6134 6135 6136 6137 6138 6139 6140 6141 |
# File 'file.c', line 6134 static VALUE rb_stat_suid(VALUE obj) { #ifdef S_ISUID if (get_stat(obj)->st_mode & S_ISUID) return Qtrue; #endif return Qfalse; } |
#size ⇒ Integer
Returns the size of stat in bytes.
File.stat("testfile").size #=> 66
826 827 828 829 830 |
# File 'file.c', line 826 static VALUE rb_stat_size(VALUE self) { return OFFT2NUM(get_stat(self)->st_size); } |
#size? ⇒ Integer?
Returns nil if stat is a zero-length file, the size of the file otherwise.
File.stat("testfile").size? #=> 66
File.stat(File::NULL).size? #=> nil
6114 6115 6116 6117 6118 6119 6120 6121 |
# File 'file.c', line 6114 static VALUE rb_stat_s(VALUE obj) { rb_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
5715 5716 5717 5718 5719 5720 5721 5722 5723 |
# File 'file.c', line 5715 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
6176 6177 6178 6179 6180 6181 6182 6183 |
# File 'file.c', line 6176 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
5694 5695 5696 5697 5698 5699 5700 5701 |
# File 'file.c', line 5694 static VALUE rb_stat_l(VALUE obj) { #ifdef S_ISLNK if (S_ISLNK(get_stat(obj)->st_mode)) return Qtrue; #endif return Qfalse; } |
#uid ⇒ Integer
Returns the numeric user id of the owner of stat.
File.stat("testfile").uid #=> 501
725 726 727 728 729 |
# File 'file.c', line 725 static VALUE rb_stat_uid(VALUE self) { return UIDT2NUM(get_stat(self)->st_uid); } |
#world_readable? ⇒ Integer?
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"
5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 |
# File 'file.c', line 5894 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)); } #endif return Qnil; } |
#world_writable? ⇒ Integer?
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"
5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 |
# File 'file.c', line 5985 static VALUE rb_stat_ww(VALUE obj) { #ifdef S_IWOTH 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)); } #endif return Qnil; } |
#writable? ⇒ Boolean
Returns true if stat is writable by the effective user id of this process.
File.stat("testfile").writable? #=> true
5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 |
# File 'file.c', line 5917 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 RBOOL(st->st_mode & S_IWUSR); #endif #ifdef S_IWGRP if (rb_stat_grpowned(obj)) return RBOOL(st->st_mode & S_IWGRP); #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
5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 |
# File 'file.c', line 5950 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 RBOOL(st->st_mode & S_IWUSR); #endif #ifdef S_IWGRP if (rb_group_member(get_stat(obj)->st_gid)) return RBOOL(st->st_mode & S_IWGRP); #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
6095 6096 6097 6098 6099 6100 |
# File 'file.c', line 6095 static VALUE rb_stat_z(VALUE obj) { if (get_stat(obj)->st_size == 0) return Qtrue; return Qfalse; } |