FileTest 模組

FileTest 實作類似於 File::Stat 所使用的檔案測試操作。它存在於獨立模組中,其方法也會暗示到 File 類別中。(請注意,這並非透過包含來完成:直譯器會作弊)。

公開實例方法

blockdev?(filepath) → true 或 false 按一下以切換來源

如果 filepath 指向區塊裝置,則傳回 true,否則傳回 false

File.blockdev?('/dev/sda1')       # => true
File.blockdev?(File.new('t.tmp')) # => false
static VALUE
rb_file_blockdev_p(VALUE obj, VALUE fname)
{
#ifndef S_ISBLK
#   ifdef S_IFBLK
#       define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
#   else
#       define S_ISBLK(m) (0)  /* anytime false */
#   endif
#endif

#ifdef S_ISBLK
    struct stat st;

    if (rb_stat(fname, &st) < 0) return Qfalse;
    if (S_ISBLK(st.st_mode)) return Qtrue;

#endif
    return Qfalse;
}
chardev?(filepath) → true 或 false 按一下以切換來源

如果 filepath 指向字元裝置,則傳回 true,否則傳回 false

File.chardev?($stdin)     # => true
File.chardev?('t.txt')     # => false
static VALUE
rb_file_chardev_p(VALUE obj, VALUE fname)
{
#ifndef S_ISCHR
#   define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
#endif

    struct stat st;

    if (rb_stat(fname, &st) < 0) return Qfalse;
    if (S_ISCHR(st.st_mode)) return Qtrue;

    return Qfalse;
}
directory?(path) → true 或 false 按一下以切換來源

給定字串 object,如果 path 是字串路徑,並指向目錄或指向目錄的符號連結,則傳回 true;否則傳回 false

File.directory?('.')              # => true
File.directory?('foo')            # => false
File.symlink('.', 'dirlink')      # => 0
File.directory?('dirlink')        # => true
File.symlink('t,txt', 'filelink') # => 0
File.directory?('filelink')       # => false

引數 path 可以是 IO 物件。

VALUE
rb_file_directory_p(VALUE obj, VALUE fname)
{
#ifndef S_ISDIR
#   define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#endif

    struct stat st;

    if (rb_stat(fname, &st) < 0) return Qfalse;
    if (S_ISDIR(st.st_mode)) return Qtrue;
    return Qfalse;
}
empty?
別名:zero?
executable?(file_name) → true 或 false 按一下以切換來源

如果指定的檔案可由這個程序的有效使用者和群組 ID 執行,則傳回 true。請參閱 eaccess(3)。

Windows 不支援與讀取權限分開的執行權限。在 Windows 上,只有檔案以 .bat、.cmd、.com 或 .exe 結尾時,才會被視為可執行。

請注意,即使檔案無法由有效使用者/群組執行,某些作業系統層級的安全功能也可能導致此函式傳回 true。

static VALUE
rb_file_executable_p(VALUE obj, VALUE fname)
{
    return RBOOL(rb_eaccess(fname, X_OK) >= 0);
}
executable_real?(file_name) → true 或 false 按一下以切換來源

如果指定的檔案可由這個程序的實際使用者和群組 ID 執行,則傳回 true。請參閱 access(3)。

Windows 不支援與讀取權限分開的執行權限。在 Windows 上,只有檔案以 .bat、.cmd、.com 或 .exe 結尾時,才會被視為可執行。

請注意,即使檔案無法由實際使用者/群組執行,某些作業系統層級的安全功能也可能導致此函式傳回 true。

static VALUE
rb_file_executable_real_p(VALUE obj, VALUE fname)
{
    return RBOOL(rb_access(fname, X_OK) >= 0);
}
exist?(file_name) → true 或 false 按一下以切換來源

如果指定檔案存在,傳回 true

file_name 可以是 IO 物件。

「檔案存在」表示 stat() 或 fstat() 系統呼叫成功。

static VALUE
rb_file_exist_p(VALUE obj, VALUE fname)
{
    struct stat st;

    if (rb_stat(fname, &st) < 0) return Qfalse;
    return Qtrue;
}
file?(file) → true 或 false 按一下以切換來源

如果指定 file 存在且為一般檔案,傳回 true

file 可以是 IO 物件。

如果 file 參數為符號連結,它會解析符號連結,並使用連結所參考的檔案。

static VALUE
rb_file_file_p(VALUE obj, VALUE fname)
{
    struct stat st;

    if (rb_stat(fname, &st) < 0) return Qfalse;
    return RBOOL(S_ISREG(st.st_mode));
}
grpowned?(file_name) → true 或 false 按一下以切換來源

如果指定檔案存在,且呼叫處理程序的有效群組識別碼為檔案的所有者,傳回 true。在 Windows 上傳回 false

file_name 可以是 IO 物件。

static VALUE
rb_file_grpowned_p(VALUE obj, VALUE fname)
{
#ifndef _WIN32
    struct stat st;

    if (rb_stat(fname, &st) < 0) return Qfalse;
    if (rb_group_member(st.st_gid)) return Qtrue;
#endif
    return Qfalse;
}
identical?(file_1, file_2) → true 或 false 按一下以切換來源

如果指定檔案相同,傳回 true

file_1file_2 可以是 IO 物件。

open("a", "w") {}
p File.identical?("a", "a")      #=> true
p File.identical?("a", "./a")    #=> true
File.link("a", "b")
p File.identical?("a", "b")      #=> true
File.symlink("a", "c")
p File.identical?("a", "c")      #=> true
open("d", "w") {}
p File.identical?("a", "d")      #=> false
static VALUE
rb_file_identical_p(VALUE obj, VALUE fname1, VALUE fname2)
{
#ifndef _WIN32
    struct stat st1, st2;

    if (rb_stat(fname1, &st1) < 0) return Qfalse;
    if (rb_stat(fname2, &st2) < 0) return Qfalse;
    if (st1.st_dev != st2.st_dev) return Qfalse;
    if (st1.st_ino != st2.st_ino) return Qfalse;
    return Qtrue;
#else
    extern VALUE rb_w32_file_identical_p(VALUE, VALUE);
    return rb_w32_file_identical_p(fname1, fname2);
#endif
}
owned?(file_name) → true 或 false 按一下以切換來源

如果指定檔案存在,且呼叫處理程序的有效使用者識別碼為檔案的所有者,傳回 true

file_name 可以是 IO 物件。

static VALUE
rb_file_owned_p(VALUE obj, VALUE fname)
{
    struct stat st;

    if (rb_stat(fname, &st) < 0) return Qfalse;
    return RBOOL(st.st_uid == geteuid());
}
pipe?(filepath) → true 或 false 按一下以切換來源

如果 filepath 指向管線,傳回 true,否則傳回 false

File.mkfifo('tmp/fifo')
File.pipe?('tmp/fifo') # => true
File.pipe?('t.txt')    # => false
static VALUE
rb_file_pipe_p(VALUE obj, VALUE fname)
{
#ifdef S_IFIFO
#  ifndef S_ISFIFO
#    define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
#  endif

    struct stat st;

    if (rb_stat(fname, &st) < 0) return Qfalse;
    if (S_ISFIFO(st.st_mode)) return Qtrue;

#endif
    return Qfalse;
}
readable?(file_name) → true 或 false 按一下以切換來源

如果這個處理程序的有效使用者和群組識別碼可讀取指定檔案,傳回 true。請參閱 eaccess(3)。

請注意,某些作業系統層級的安全功能可能會導致傳回 true,即使有效使用者/群組無法讀取檔案。

static VALUE
rb_file_readable_p(VALUE obj, VALUE fname)
{
    return RBOOL(rb_eaccess(fname, R_OK) >= 0);
}
readable_real?(file_name) → true 或 false 按一下以切換來源

如果此程序的實際使用者和群組 ID 可讀取指定檔案,則傳回 true。請參閱 access(3)。

請注意,即使檔案無法由實際使用者/群組讀取,某些作業系統層級的安全功能也可能導致此函數傳回 true。

static VALUE
rb_file_readable_real_p(VALUE obj, VALUE fname)
{
    return RBOOL(rb_access(fname, R_OK) >= 0);
}
setgid?(file_name) → true 或 false 按一下以切換來源

如果指定檔案已設定 setgid 位元,則傳回 true

file_name 可以是 IO 物件。

static VALUE
rb_file_sgid_p(VALUE obj, VALUE fname)
{
#ifdef S_ISGID
    return check3rdbyte(fname, S_ISGID);
#else
    return Qfalse;
#endif
}
setuid?(file_name) → true 或 false 按一下以切換來源

如果指定檔案已設定 setuid 位元,則傳回 true

file_name 可以是 IO 物件。

static VALUE
rb_file_suid_p(VALUE obj, VALUE fname)
{
#ifdef S_ISUID
    return check3rdbyte(fname, S_ISUID);
#else
    return Qfalse;
#endif
}
size(file_name) → 整數 按一下以切換來源

傳回 file_name 的大小。

file_name 可以是 IO 物件。

static VALUE
rb_file_s_size(VALUE klass, VALUE fname)
{
    struct stat st;

    if (rb_stat(fname, &st) < 0) {
        int e = errno;
        FilePathValue(fname);
        rb_syserr_fail_path(e, fname);
    }
    return OFFT2NUM(st.st_size);
}
size?(file_name) → 整數或 nil 按一下以切換來源

如果 file_name 不存在或大小為零,則傳回 nil,否則傳回檔案的大小。

file_name 可以是 IO 物件。

static VALUE
rb_file_size_p(VALUE obj, VALUE fname)
{
    struct stat st;

    if (rb_stat(fname, &st) < 0) return Qnil;
    if (st.st_size == 0) return Qnil;
    return OFFT2NUM(st.st_size);
}
socket?(filepath) → true 或 false 按一下以切換來源

如果 filepath 指向 socket,則傳回 true,否則傳回 false

require 'socket'
File.socket?(Socket.new(:INET, :STREAM)) # => true
File.socket?(File.new('t.txt'))          # => false
static VALUE
rb_file_socket_p(VALUE obj, VALUE fname)
{
#ifndef S_ISSOCK
#  ifdef _S_ISSOCK
#    define S_ISSOCK(m) _S_ISSOCK(m)
#  else
#    ifdef _S_IFSOCK
#      define S_ISSOCK(m) (((m) & S_IFMT) == _S_IFSOCK)
#    else
#      ifdef S_IFSOCK
#        define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
#      endif
#    endif
#  endif
#endif

#ifdef S_ISSOCK
    struct stat st;

    if (rb_stat(fname, &st) < 0) return Qfalse;
    if (S_ISSOCK(st.st_mode)) return Qtrue;
#endif

    return Qfalse;
}
sticky?(file_name) → true 或 false 按一下以切換來源

如果指定檔案已設定 sticky 位元,則傳回 true

file_name 可以是 IO 物件。

static VALUE
rb_file_sticky_p(VALUE obj, VALUE fname)
{
#ifdef S_ISVTX
    return check3rdbyte(fname, S_ISVTX);
#else
    return Qfalse;
#endif
}
world_readable?(file_name) → 整數或 nil 按一下以切換來源

如果他人可讀取 file_name,則傳回表示 file_name 檔案權限位元的整數。否則傳回 nil。位元的意義取決於平台;在 Unix 系統上,請參閱 stat(2)

file_name 可以是 IO 物件。

File.world_readable?("/etc/passwd")           #=> 420
m = File.world_readable?("/etc/passwd")
sprintf("%o", m)                              #=> "644"
static VALUE
rb_file_world_readable_p(VALUE obj, VALUE fname)
{
#ifdef S_IROTH
    struct stat st;

    if (rb_stat(fname, &st) < 0) return Qnil;
    if ((st.st_mode & (S_IROTH)) == S_IROTH) {
        return UINT2NUM(st.st_mode & (S_IRUGO|S_IWUGO|S_IXUGO));
    }
#endif
    return Qnil;
}
world_writable?(file_name) → 整數或 nil 按一下以切換來源

如果他人可寫入 file_name,則傳回表示 file_name 檔案權限位元的整數。否則傳回 nil。位元的意義取決於平台;在 Unix 系統上,請參閱 stat(2)

file_name 可以是 IO 物件。

File.world_writable?("/tmp")                  #=> 511
m = File.world_writable?("/tmp")
sprintf("%o", m)                              #=> "777"
static VALUE
rb_file_world_writable_p(VALUE obj, VALUE fname)
{
#ifdef S_IWOTH
    struct stat st;

    if (rb_stat(fname, &st) < 0) return Qnil;
    if ((st.st_mode & (S_IWOTH)) == S_IWOTH) {
        return UINT2NUM(st.st_mode & (S_IRUGO|S_IWUGO|S_IXUGO));
    }
#endif
    return Qnil;
}
writable?(file_name) → true 或 false 按一下以切換來源

如果這個程序的有效使用者和群組 ID 可以寫入指定的檔案,則傳回 true。請參閱 eaccess(3)。

請注意,某些作業系統層級的安全功能可能會導致即使有效使用者/群組無法寫入檔案,此函式仍會傳回 true。

static VALUE
rb_file_writable_p(VALUE obj, VALUE fname)
{
    return RBOOL(rb_eaccess(fname, W_OK) >= 0);
}
writable_real?(file_name) → true 或 false 按一下以切換來源

如果這個程序的實際使用者和群組 ID 可以寫入指定的檔案,則傳回 true。請參閱 access(3)。

請注意,某些作業系統層級的安全功能可能會導致即使實際使用者/群組無法寫入檔案,此函式仍會傳回 true。

static VALUE
rb_file_writable_real_p(VALUE obj, VALUE fname)
{
    return RBOOL(rb_access(fname, W_OK) >= 0);
}
zero?(file_name) → true 或 false 按一下以切換來源

如果指定的檔案存在且大小為零,則傳回 true

file_name 可以是 IO 物件。

static VALUE
rb_file_zero_p(VALUE obj, VALUE fname)
{
    struct stat st;

    if (rb_stat(fname, &st) < 0) return Qfalse;
    return RBOOL(st.st_size == 0);
}
別名為: empty?