class File::Stat
Objekte der Klasse File::Stat kapseln allgemeine Statusinformationen für File-Objekte. Die Informationen werden in dem Moment erfasst, in dem das Objekt File::Stat erstellt wird; Änderungen an der Datei nach diesem Zeitpunkt werden nicht widergespiegelt. File::Stat-Objekte werden von IO#stat, File::stat, File#lstat und File::lstat zurückgegeben. Viele dieser Methoden geben plattformspezifische Werte zurück, und nicht alle Werte sind auf allen Systemen sinnvoll. Siehe auch Kernel#test.
Öffentliche Klassenmethoden
Source
static VALUE
rb_stat_init(VALUE obj, VALUE fname)
{
rb_io_stat_data st;
FilePathValue(fname);
fname = rb_str_encode_ospath(fname);
if (STATX(StringValueCStr(fname), &st, STATX_ALL) == -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;
}
Erstellt ein File::Stat-Objekt für den angegebenen Dateinamen (löst eine Ausnahme aus, wenn die Datei nicht existiert).
Öffentliche Instanzmethoden
Source
static VALUE
rb_stat_cmp(VALUE self, VALUE other)
{
if (rb_obj_is_kind_of(other, rb_obj_class(self))) {
stat_timestamp ts1 = statx_mtimespec(get_stat(self));
stat_timestamp ts2 = statx_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;
}
Vergleicht self und other, indem ihre Änderungszeiten verglichen werden; das heißt, indem self.mtime und other.mtime verglichen werden.
Gibt zurück
-
-1, wennself.mtimefrüher ist. -
0, wenn die beiden Werte gleich sind. -
1, wennself.mtimespäter ist. -
nil, wennotherkein Objekt vom TypFile::Statist.
Beispiele
stat0 = File.stat('README.md') stat1 = File.stat('NEWS.md') stat0.mtime # => 2025-12-20 15:33:05.6972341 -0600 stat1.mtime # => 2025-12-20 16:02:08.2672945 -0600 stat0 <=> stat1 # => -1 stat0 <=> stat0.dup # => 0 stat1 <=> stat0 # => 1 stat0 <=> :foo # => nil
Die Klasse File::Stat enthält das Modul Comparable, dessen Methoden alle File::Stat#<=> zum Vergleichen verwenden.
Source
static VALUE
rb_stat_atime(VALUE self)
{
return stat_time(statx_atimespec(get_stat(self)));
}
Gibt die letzte Zugriffszeit dieser Datei als Objekt der Klasse Time zurück.
File.stat("testfile").atime #=> Wed Dec 31 18:00:00 CST 1969
Source
static VALUE
rb_stat_birthtime(VALUE self)
{
return statx_birthtime(get_stat(self));
}
Gibt die Erzeugungszeit für stat zurück.
Wenn die Plattform keine Erzeugungszeit hat, wird NotImplementedError ausgelöst.
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
Source
static VALUE
rb_stat_blksize(VALUE self)
{
#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
return ULONG2NUM(get_stat(self)->ST_(blksize));
#else
return Qnil;
#endif
}
Gibt die Blockgröße des nativen Dateisystems zurück. Gibt nil auf Plattformen zurück, die diese Informationen nicht unterstützen.
File.stat("testfile").blksize #=> 4096
Source
static VALUE
rb_stat_b(VALUE obj)
{
#ifdef S_ISBLK
if (S_ISBLK(get_stat(obj)->ST_(mode))) return Qtrue;
#endif
return Qfalse;
}
Gibt true zurück, wenn die Datei ein Blockgerät ist, false, wenn nicht, oder wenn das Betriebssystem diese Funktion nicht unterstützt.
File.stat("testfile").blockdev? #=> false File.stat("/dev/hda1").blockdev? #=> true
Source
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
}
Gibt die Anzahl der für diese Datei zugewiesenen Blöcke des nativen Dateisystems zurück, oder nil, wenn das Betriebssystem diese Funktion nicht unterstützt.
File.stat("testfile").blocks #=> 2
Source
static VALUE
rb_stat_c(VALUE obj)
{
if (S_ISCHR(get_stat(obj)->ST_(mode))) return Qtrue;
return Qfalse;
}
Gibt true zurück, wenn die Datei ein Zeichengerät ist, false, wenn nicht, oder wenn das Betriebssystem diese Funktion nicht unterstützt.
File.stat("/dev/tty").chardev? #=> true
Source
static VALUE
rb_stat_ctime(VALUE self)
{
return stat_time(statx_ctimespec(get_stat(self)));
}
Gibt die Änderungszeit für stat zurück (d. h. die Zeit, zu der die Verzeichnisinformationen über die Datei geändert wurden, nicht die Datei selbst).
Hinweis: Unter Windows (NTFS) wird die Erzeugungszeit (birth time) zurückgegeben.
File.stat("testfile").ctime #=> Wed Apr 09 08:53:14 CDT 2003
Source
static VALUE
rb_stat_dev(VALUE self)
{
#if RUBY_USE_STATX
unsigned int m = get_stat(self)->stx_dev_major;
unsigned int n = get_stat(self)->stx_dev_minor;
return ULL2NUM(makedev(m, n));
#elif 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
}
Gibt eine Ganzzahl zurück, die das Gerät darstellt, auf dem sich stat befindet.
File.stat("testfile").dev #=> 774
Source
static VALUE
rb_stat_dev_major(VALUE self)
{
#if RUBY_USE_STATX
return UINT2NUM(get_stat(self)->stx_dev_major);
#elif defined(major)
return UINT2NUM(major(get_stat(self)->st_dev));
#else
return Qnil;
#endif
}
Gibt den Hauptteil von File_Stat#dev oder nil zurück.
File.stat("/dev/fd1").dev_major #=> 2 File.stat("/dev/tty").dev_major #=> 5
Source
static VALUE
rb_stat_dev_minor(VALUE self)
{
#if RUBY_USE_STATX
return UINT2NUM(get_stat(self)->stx_dev_minor);
#elif defined(minor)
return UINT2NUM(minor(get_stat(self)->st_dev));
#else
return Qnil;
#endif
}
Gibt den Nebenteil von File_Stat#dev oder nil zurück.
File.stat("/dev/fd1").dev_minor #=> 1 File.stat("/dev/tty").dev_minor #=> 0
Source
static VALUE
rb_stat_d(VALUE obj)
{
if (S_ISDIR(get_stat(obj)->ST_(mode))) return Qtrue;
return Qfalse;
}
Gibt true zurück, wenn stat ein Verzeichnis ist, andernfalls false.
File.stat("testfile").directory? #=> false File.stat(".").directory? #=> true
Source
static VALUE
rb_stat_x(VALUE obj)
{
rb_io_stat_data *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;
}
Gibt true zurück, wenn stat ausführbar ist oder wenn das Betriebssystem ausführbare Dateien nicht von nicht ausführbaren Dateien unterscheidet. Die Prüfungen werden anhand des effektiven Besitzers des Prozesses durchgeführt.
File.stat("testfile").executable? #=> false
Source
static VALUE
rb_stat_X(VALUE obj)
{
rb_io_stat_data *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;
}
Entspricht executable?, prüft aber anhand des realen Besitzers des Prozesses.
Source
static VALUE
rb_stat_f(VALUE obj)
{
if (S_ISREG(get_stat(obj)->ST_(mode))) return Qtrue;
return Qfalse;
}
Gibt true zurück, wenn stat eine reguläre Datei ist (keine Gerätedatei, kein Pipe, kein Socket usw.).
File.stat("testfile").file? #=> true
Source
static VALUE
rb_stat_ftype(VALUE obj)
{
return rb_file_ftype(get_stat(obj)->ST_(mode));
}
Identifiziert den Typ von stat. Der Rückgabewert ist einer der folgenden: „file“, „directory“, „characterSpecial“, „blockSpecial“, „fifo“, „link“, „socket“ oder „unknown“.
File.stat("/dev/tty").ftype #=> "characterSpecial"
Source
static VALUE
rb_stat_gid(VALUE self)
{
return GIDT2NUM(get_stat(self)->ST_(gid));
}
Gibt die numerische Gruppen-ID des Besitzers von stat zurück.
File.stat("testfile").gid #=> 500
Source
static VALUE
rb_stat_grpowned(VALUE obj)
{
#ifndef _WIN32
if (rb_group_member(get_stat(obj)->ST_(gid))) return Qtrue;
#endif
return Qfalse;
}
Gibt true zurück, wenn die effektive Gruppen-ID des Prozesses mit der Gruppen-ID von stat übereinstimmt. Unter Windows wird false zurückgegeben.
File.stat("testfile").grpowned? #=> true File.stat("/etc/passwd").grpowned? #=> false
Source
static VALUE
rb_stat_ino(VALUE self)
{
rb_io_stat_data *ptr = get_stat(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(&ptr->st_ino, 2,
SIZEOF_STRUCT_STAT_ST_INO, 0,
INTEGER_PACK_LSWORD_FIRST|INTEGER_PACK_NATIVE_BYTE_ORDER|
INTEGER_PACK_2COMP);
#else
return UIANY2NUM(ptr->ST_(ino));
#endif
}
Gibt die Inode-Nummer für stat zurück.
File.stat("testfile").ino #=> 1083669
Source
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;
}
Erzeugt eine ansprechend formatierte Beschreibung von 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>"
Source
static VALUE
rb_stat_mode(VALUE self)
{
return UINT2NUM(ST2UINT(get_stat(self)->ST_(mode)));
}
Gibt eine Ganzzahl zurück, die die Berechtigungsbits von stat darstellt. Die Bedeutung der Bits ist plattformabhängig; auf Unix-Systemen siehe stat(2).
File.chmod(0644, "testfile") #=> 1 s = File.stat("testfile") sprintf("%o", s.mode) #=> "100644"
Source
static VALUE
rb_stat_mtime(VALUE self)
{
return stat_time(statx_mtimespec(get_stat(self)));
}
Gibt die Änderungszeit von stat zurück.
File.stat("testfile").mtime #=> Wed Apr 09 08:53:14 CDT 2003
Source
static VALUE
rb_stat_nlink(VALUE self)
{
/* struct stat::st_nlink is nlink_t in POSIX. Not the case for Windows. */
const rb_io_stat_data *ptr = get_stat(self);
return UIANY2NUM(ptr->ST_(nlink));
}
Gibt die Anzahl der Hardlinks zu stat zurück.
File.stat("testfile").nlink #=> 1 File.link("testfile", "testfile.bak") #=> 0 File.stat("testfile").nlink #=> 2
Source
static VALUE
rb_stat_owned(VALUE obj)
{
if (get_stat(obj)->ST_(uid) == geteuid()) return Qtrue;
return Qfalse;
}
Gibt true zurück, wenn die effektive Benutzer-ID des Prozesses mit dem Besitzer von stat übereinstimmt.
File.stat("testfile").owned? #=> true File.stat("/etc/passwd").owned? #=> false
Source
static VALUE
rb_stat_p(VALUE obj)
{
#ifdef S_IFIFO
if (S_ISFIFO(get_stat(obj)->ST_(mode))) return Qtrue;
#endif
return Qfalse;
}
Gibt true zurück, wenn das Betriebssystem Pipes unterstützt und stat eine Pipe ist; andernfalls false.
Source
static VALUE
rb_stat_rdev(VALUE self)
{
#if RUBY_USE_STATX
unsigned int m = get_stat(self)->stx_rdev_major;
unsigned int n = get_stat(self)->stx_rdev_minor;
return ULL2NUM(makedev(m, n));
#elif !defined(HAVE_STRUCT_STAT_ST_RDEV)
return Qnil;
#elif 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
}
Gibt eine Ganzzahl zurück, die den Gerätetyp darstellt, auf dem sich stat befindet. Gibt nil zurück, wenn das Betriebssystem diese Funktion nicht unterstützt.
File.stat("/dev/fd1").rdev #=> 513 File.stat("/dev/tty").rdev #=> 1280
Source
static VALUE
rb_stat_rdev_major(VALUE self)
{
#if RUBY_USE_STATX
return UINT2NUM(get_stat(self)->stx_rdev_major);
#elif defined(HAVE_STRUCT_STAT_ST_RDEV) && defined(major)
return UINT2NUM(major(get_stat(self)->ST_(rdev)));
#else
return Qnil;
#endif
}
Gibt den Hauptteil von File_Stat#rdev oder nil zurück.
File.stat("/dev/fd1").rdev_major #=> 2 File.stat("/dev/tty").rdev_major #=> 5
Source
static VALUE
rb_stat_rdev_minor(VALUE self)
{
#if RUBY_USE_STATX
return UINT2NUM(get_stat(self)->stx_rdev_minor);
#elif defined(HAVE_STRUCT_STAT_ST_RDEV) && defined(minor)
return UINT2NUM(minor(get_stat(self)->ST_(rdev)));
#else
return Qnil;
#endif
}
Gibt den Nebenteil von File_Stat#rdev oder nil zurück.
File.stat("/dev/fd1").rdev_minor #=> 1 File.stat("/dev/tty").rdev_minor #=> 0
Source
static VALUE
rb_stat_r(VALUE obj)
{
rb_io_stat_data *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;
}
Gibt true zurück, wenn stat von der effektiven Benutzer-ID dieses Prozesses lesbar ist.
File.stat("testfile").readable? #=> true
Source
static VALUE
rb_stat_R(VALUE obj)
{
rb_io_stat_data *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;
}
Gibt true zurück, wenn stat von der realen Benutzer-ID dieses Prozesses lesbar ist.
File.stat("testfile").readable_real? #=> true
Source
static VALUE
rb_stat_sgid(VALUE obj)
{
#ifdef S_ISGID
if (get_stat(obj)->ST_(mode) & S_ISGID) return Qtrue;
#endif
return Qfalse;
}
Gibt true zurück, wenn stat das Set-Group-ID-Berechtigungsbit gesetzt hat, false, wenn nicht, oder wenn das Betriebssystem diese Funktion nicht unterstützt.
File.stat("/usr/sbin/lpc").setgid? #=> true
Source
static VALUE
rb_stat_suid(VALUE obj)
{
#ifdef S_ISUID
if (get_stat(obj)->ST_(mode) & S_ISUID) return Qtrue;
#endif
return Qfalse;
}
Gibt true zurück, wenn stat das Set-User-ID-Berechtigungsbit gesetzt hat, false, wenn nicht, oder wenn das Betriebssystem diese Funktion nicht unterstützt.
File.stat("/bin/su").setuid? #=> true
Source
static VALUE
rb_stat_size(VALUE self)
{
return OFFT2NUM(get_stat(self)->ST_(size));
}
Gibt die Größe von stat in Bytes zurück.
File.stat("testfile").size #=> 66
Source
static VALUE
rb_stat_s(VALUE obj)
{
rb_off_t size = get_stat(obj)->ST_(size);
if (size == 0) return Qnil;
return OFFT2NUM(size);
}
Gibt nil zurück, wenn stat eine Datei mit null Länge ist, andernfalls die Größe der Datei.
File.stat("testfile").size? #=> 66 File.stat(File::NULL).size? #=> nil
Source
static VALUE
rb_stat_S(VALUE obj)
{
#ifdef S_ISSOCK
if (S_ISSOCK(get_stat(obj)->ST_(mode))) return Qtrue;
#endif
return Qfalse;
}
Gibt true zurück, wenn stat ein Socket ist, false, wenn nicht, oder wenn das Betriebssystem diese Funktion nicht unterstützt.
File.stat("testfile").socket? #=> false
Source
static VALUE
rb_stat_sticky(VALUE obj)
{
#ifdef S_ISVTX
if (get_stat(obj)->ST_(mode) & S_ISVTX) return Qtrue;
#endif
return Qfalse;
}
Gibt true zurück, wenn stat seinen Sticky-Bit gesetzt hat, false, wenn nicht, oder wenn das Betriebssystem diese Funktion nicht unterstützt.
File.stat("testfile").sticky? #=> false
Source
static VALUE
rb_stat_l(VALUE obj)
{
#ifdef S_ISLNK
if (S_ISLNK(get_stat(obj)->ST_(mode))) return Qtrue;
#endif
return Qfalse;
}
Gibt true zurück, wenn stat ein symbolischer Link ist, false, wenn nicht, oder wenn das Betriebssystem diese Funktion nicht unterstützt. Da File::stat symbolische Links automatisch folgt, ist symlink? immer false für ein Objekt, das von File::stat zurückgegeben wird.
File.symlink("testfile", "alink") #=> 0 File.stat("alink").symlink? #=> false File.lstat("alink").symlink? #=> true
Source
static VALUE
rb_stat_uid(VALUE self)
{
return UIDT2NUM(get_stat(self)->ST_(uid));
}
Gibt die numerische Benutzer-ID des Besitzers von stat zurück.
File.stat("testfile").uid #=> 501
Source
static VALUE
rb_stat_wr(VALUE obj)
{
#ifdef S_IROTH
rb_io_stat_data *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;
}
Wenn stat von anderen lesbar ist, wird eine Ganzzahl zurückgegeben, die die Dateiberechtigungsbits von stat darstellt. Andernfalls wird nil zurückgegeben. Die Bedeutung der Bits ist plattformabhängig; auf Unix-Systemen siehe stat(2).
m = File.stat("/etc/passwd").world_readable? #=> 420 sprintf("%o", m) #=> "644"
Source
static VALUE
rb_stat_ww(VALUE obj)
{
#ifdef S_IWOTH
rb_io_stat_data *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;
}
Wenn stat von anderen beschreibbar ist, wird eine Ganzzahl zurückgegeben, die die Dateiberechtigungsbits von stat darstellt. Andernfalls wird nil zurückgegeben. Die Bedeutung der Bits ist plattformabhängig; auf Unix-Systemen siehe stat(2).
m = File.stat("/tmp").world_writable? #=> 511 sprintf("%o", m) #=> "777"
Source
static VALUE
rb_stat_w(VALUE obj)
{
rb_io_stat_data *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;
}
Gibt true zurück, wenn stat von der effektiven Benutzer-ID dieses Prozesses beschreibbar ist.
File.stat("testfile").writable? #=> true
Source
static VALUE
rb_stat_W(VALUE obj)
{
rb_io_stat_data *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;
}
Gibt true zurück, wenn stat von der realen Benutzer-ID dieses Prozesses beschreibbar ist.
File.stat("testfile").writable_real? #=> true
Source
static VALUE
rb_stat_z(VALUE obj)
{
if (get_stat(obj)->ST_(size) == 0) return Qtrue;
return Qfalse;
}
Gibt true zurück, wenn stat eine Datei mit null Länge ist; andernfalls false.
File.stat("testfile").zero? #=> false