From: shugo@... (Shugo Maeda) Date: 1998-04-09T21:39:42+09:00 Subject: [ruby-dev:2215] Dir#new etc.... 前田です。 いくつかDirに関して要望(?)があります。 1). Dir#newが再定義されていないので、Dir.newするとまずいようです。 2). Dir#openもFile#openのようにイテレータ呼び出しできるようにしては どうでしょうか。 3). tellやseekもあるのでreadも用意してはどうでしょうか。 4). chdirやchrootでrb_sys_failにディレクトリ名を渡すように してはどうでしょうか。 -- 前田 修吾 --- dir.c.orig Mon Mar 30 18:32:45 1998 +++ dir.c Wed Apr 8 17:24:11 1998 @@ -63,6 +63,7 @@ dir_s_open(dir_class, dirname) VALUE dir_class, dirname; { + static VALUE dir_close(VALUE); VALUE obj; DIR *dirp; @@ -81,6 +82,9 @@ obj = Data_Wrap_Struct(dir_class, 0, free_dir, dirp); + if (iterator_p()) + rb_ensure(rb_yield, obj, dir_close, obj); + return obj; } @@ -96,6 +100,21 @@ } static VALUE +dir_read(dir) + VALUE dir; +{ + DIR *dirp; + struct dirent *dp; + + GetDIR(dir, dirp); + dp = readdir(dirp); + if (dp) + return str_taint(str_new(dp->d_name, NAMLEN(dp))); + else + return Qnil; +} + +static VALUE dir_each(dir) VALUE dir; { @@ -190,7 +209,7 @@ } if (chdir(dist) < 0) - rb_sys_fail(0); + rb_sys_fail(dist); return INT2FIX(0); } @@ -220,7 +239,7 @@ Check_SafeStr(path); if (chroot(RSTRING(path)->ptr) == -1) - rb_sys_fail(0); + rb_sys_fail(RSTRING(path)->ptr); return INT2FIX(0); #else @@ -402,9 +421,11 @@ rb_include_module(cDir, mEnumerable); + rb_define_singleton_method(cDir, "new", dir_s_open, 1); rb_define_singleton_method(cDir, "open", dir_s_open, 1); rb_define_singleton_method(cDir, "foreach", dir_foreach, 1); + rb_define_method(cDir,"read", dir_read, 0); rb_define_method(cDir,"each", dir_each, 0); rb_define_method(cDir,"rewind", dir_rewind, 0); rb_define_method(cDir,"tell", dir_tell, 0);