FileTest
module FileTest
FileTest
执行类似于中使用的文件测试操作File::Stat
。它作为一个独立的模块存在,其方法也被隐藏到File0
类别中。(请注意,这不是通过包含:解释器作弊)。
Public Instance Methods
blockdev?(file_name) → true or false Show source
如果指定文件是块设备,则返回true
。
file_name
可以是IO对象。
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?(file_name) → true or false Show source
如果指定的文件是字符设备,则返回true
。
file_name
可以是IO对象。
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?(file_name) → true or false Show source
如果指定的文件是目录或指向目录的符号链接,则返回true
;否则返回false
。
file_name
可以是IO对象。
File.directory?(".")
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;
}
zero?(file_name) → true or false Show source
返回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;
if (st.st_size == 0) return Qtrue;
return Qfalse;
}
executable?(file_name) → true or false Show source
返回true
指定文件是否可由此进程的有效用户和组标识执行。参见eaccess(3)。
static VALUE
rb_file_executable_p(VALUE obj, VALUE fname)
{
FilePathValue(fname
fname = rb_str_encode_ospath(fname
if (eaccess(StringValueCStr(fname), X_OK) < 0) return Qfalse;
return Qtrue;
}
executable_real?(file_name) → true or false Show source
如果指定文件可由此进程的实际用户和组标识执行,则返回true
。请参阅访问权限(3)。
static VALUE
rb_file_executable_real_p(VALUE obj, VALUE fname)
{
FilePathValue(fname
fname = rb_str_encode_ospath(fname
if (access(StringValueCStr(fname), X_OK) < 0) return Qfalse;
return Qtrue;
}
exist?(file_name) → true or false Show source
如果指定的文件存在,则返回true
。
file_name
可以是IO对象。
“file exists”意味着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;
}
exists?(file_name) → true or false Show source
弃用的方法。不要使用。
static VALUE
rb_file_exists_p(VALUE obj, VALUE fname)
{
const char *s = "FileTest#";
if (obj == rb_mFileTest) {
s = "FileTest.";
}
else if (obj == rb_cFile ||
(RB_TYPE_P(obj, T_CLASS) &&
RTEST(rb_class_inherited_p(obj, rb_cFile)))) {
s = "File.";
}
rb_warning("%sexists? is a deprecated name, use %sexist? instead", s, s
return rb_file_exist_p(obj, fname
}
file?(file) → true or false Show source
返回true
如果file
名称存在并且是常规文件。
file
可以是IO对象。
If the file
argument is a symbolic link, it will resolve the symbolic link and use the file
referenced by the link.
static VALUE
rb_file_file_p(VALUE obj, VALUE fname)
{
struct stat st;
if (rb_stat(fname, &st) < 0) return Qfalse;
if (S_ISREG(st.st_mode)) return Qtrue;
return Qfalse;
}
grpowned?(file_name) → true or false Show source
返回true
指定文件是否存在,并且调用进程的有效组标识是文件的所有者。在Windows上返回false
。
file
_
name
can be an IO object.
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 or false Show source
如果命名文件相同则返回true
。
file_1
和file_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
BY_HANDLE_FILE_INFORMATION st1, st2;
HANDLE f1 = 0, f2 = 0;
f1 = w32_io_info(&fname1, &st1
if (f1 == INVALID_HANDLE_VALUE) return Qfalse;
if (f1) {
struct w32_io_info_args arg;
arg.fname = &fname2;
arg.st = &st2;
f2 = (HANDLE)rb_ensure(call_w32_io_info, (VALUE)&arg, close_handle, (VALUE)f1
}
else {
f2 = w32_io_info(&fname2, &st2
}
if (f2 == INVALID_HANDLE_VALUE) return Qfalse;
if (f2) CloseHandle(f2
if (st1.dwVolumeSerialNumber == st2.dwVolumeSerialNumber &&
st1.nFileIndexHigh == st2.nFileIndexHigh &&
st1.nFileIndexLow == st2.nFileIndexLow)
return Qtrue;
return Qfalse;
#endif
}
owned?(file_name) → true or false Show source
返回true
指定文件是否存在,并且调用进程的有效使用ID是文件的所有者。
file_name
可以是IO对象。
static VALUE
rb_file_owned_p(VALUE obj, VALUE fname)
{
struct stat st;
if (rb_stat(fname, &st) < 0) return Qfalse;
if (st.st_uid == geteuid()) return Qtrue;
return Qfalse;
}
pipe?(file_name) → true or false Show source
返回true
指定文件是否为pipe。
file_name
可以是IO对象。
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 or false Show source
返回true
指定文件是否可由此进程的有效用户和组标识读取。参见eaccess(3)。
static VALUE
rb_file_readable_p(VALUE obj, VALUE fname)
{
FilePathValue(fname
fname = rb_str_encode_ospath(fname
if (eaccess(StringValueCStr(fname), R_OK) < 0) return Qfalse;
return Qtrue;
}
readable_real?(file_name) → true or false Show source
返回true
指定文件是否可由此进程的实际用户和组标识读取。请参阅访问权限(3)。
static VALUE
rb_file_readable_real_p(VALUE obj, VALUE fname)
{
FilePathValue(fname
fname = rb_str_encode_ospath(fname
if (access(StringValueCStr(fname), R_OK) < 0) return Qfalse;
return Qtrue;
}
setgid?(file_name) → true or false Show source
返回true
指定文件是否设置了setgid位。
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 or false Show source
返回true
指定文件是否设置了setuid位。
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) → integer Show source
返回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) → Integer or nil Show source
返回nil
如果file_name
不存在或具有零大小,否则返回文件的大小。
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?(file_name) → true or false Show source
如果指定的文件是套接字,则返回true
。
file_name
可以是IO对象。
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 or false Show source
返回true
指定文件是否设置了粘滞位。
static VALUE
rb_file_sticky_p(VALUE obj, VALUE fname)
{
#ifdef S_ISVTX
return check3rdbyte(fname, S_ISVTX
#else
return Qnil;
#endif
}
symlink?(file_name) → true or false Show source
返回true
指定文件是否为符号链接。
static VALUE
rb_file_symlink_p(VALUE obj, VALUE fname)
{
#ifndef S_ISLNK
# ifdef _S_ISLNK
# define S_ISLNK(m) _S_ISLNK(m)
# else
# ifdef _S_IFLNK
# define S_ISLNK(m) (((m) & S_IFMT) == _S_IFLNK)
# else
# ifdef S_IFLNK
# define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
# endif
# endif
# endif
#endif
#ifdef S_ISLNK
struct stat st;
FilePathValue(fname
fname = rb_str_encode_ospath(fname
if (lstat(StringValueCStr(fname), &st) < 0) return Qfalse;
if (S_ISLNK(st.st_mode)) return Qtrue;
#endif
return Qfalse;
}
world_readable?(file_name) → integer or nil Show source
如果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) → integer or nil Show source
如果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 or false Show source
返回true
指定文件是否可由此进程的有效用户和组标识写入。参见eaccess(3)。
static VALUE
rb_file_writable_p(VALUE obj, VALUE fname)
{
FilePathValue(fname
fname = rb_str_encode_ospath(fname
if (eaccess(StringValueCStr(fname), W_OK) < 0) return Qfalse;
return Qtrue;
}
writable_real?(file_name) → true or false Show source
返回true
指定文件是否可由此进程的实际用户和组标识写入。查看访问权限(3)
static VALUE
rb_file_writable_real_p(VALUE obj, VALUE fname)
{
FilePathValue(fname
fname = rb_str_encode_ospath(fname
if (access(StringValueCStr(fname), W_OK) < 0) return Qfalse;
return Qtrue;
}
zero?(file_name) → true or false Show source
返回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;
if (st.st_size == 0) return Qtrue;
return Qfalse;
}