класс Dir
Объекты класса Dir представляют собой потоки каталогов, отображающие каталоги в файловой системе. Они предоставляют различные способы перечисления каталогов и их содержимого. См. также File.
Каталог, используемый в этих примерах, содержит две обычные файлы (config.h и main.rb), родительский каталог (..) и сам каталог (.).
Что здесь
Сначала, что где-то еще. Класс Dir:
-
Наследуется от класса Объект.
-
Включает модуль Перечислимый, который предоставляет десятки дополнительных методов.
Здесь класс Dir предоставляет методы, полезные для:
Чтение
-
close: Закрывает поток каталога дляself. -
pos=: Устанавливает позицию в потоке каталога дляself. -
read: Читает и возвращает следующую запись в потоке каталога дляself. -
rewind: Устанавливает позицию в потоке каталога дляselfв первую запись. -
seek: Устанавливает позицию в потоке каталога дляselfзаписи по заданному смещению.
Установка
-
::chdir: Изменяет рабочий каталог текущего процесса на указанный каталог. -
::chroot: Изменяет корень файловой системы для текущего процесса на указанный каталог.
Запрос
-
::children: Возвращает массив имен дочерних элементов (как файлов, так и каталогов) заданного каталога, но не включая.или... -
::empty?: Возвращает, является ли заданный путь пустым каталогом. -
::entries: Возвращает массив имен дочерних элементов (как файлов, так и каталогов) заданного каталога, включая.и... -
::exist?: Возвращает, является ли заданный путь каталогом. -
::getwd(алиас pwd): Возвращает путь к текущему рабочему каталогу. -
::glob: Возвращает массив путей к файлам, соответствующим заданному шаблону и флагам. -
::home: Возвращает путь к домашнему каталогу для данного пользователя или текущего пользователя. -
children: Возвращает массив имен дочерних элементов (как файлов, так и каталогов)self, но не включая.или... -
fileno: Возвращает целочисленный дескриптор файла дляself. -
path(алиасto_path): Возвращает путь, используемый для созданияself. -
tell(алиасpos): Возвращает целочисленную позицию в потоке каталога дляself.
Итерация
-
::each_child: Вызывает заданный блок для каждой записи в данном каталоге, но не включая.или... -
::foreach: Вызывает заданный блок для каждой записи в данном каталоге, включая.и... -
each: Вызывает заданный блок для каждой записи вself, включая.и... -
each_child: Вызывает заданный блок для каждой записи вself, но не включая.или...
Другие
-
::mkdir: Создаёт каталог по указанному пути с необязательными правами доступа. -
::new: Возвращает новый Dir для указанного пути с необязательным кодированием. -
::open: То же, что и::new, но если задан блок, то возвращает Dir в блок, закрывая его по завершении блока. -
::unlink(алиас::deleteи::rmdir): Удаляет указанный каталог. -
inspect: Возвращает строковое описаниеself.
Методы публичного класса
# File dir.rb, line 127 def self.[](*args, base: nil, sort: true) Primitive.dir_s_aref(args, base, sort) end
Эквивалентно вызову Dir.glob([string,…], 0).
static VALUE
dir_s_chdir(int argc, VALUE *argv, VALUE obj)
{
VALUE path = Qnil;
if (rb_check_arity(argc, 0, 1) == 1) {
path = rb_str_encode_ospath(rb_get_path(argv[0]));
}
else {
const char *dist = getenv("HOME");
if (!dist) {
dist = getenv("LOGDIR");
if (!dist) rb_raise(rb_eArgError, "HOME/LOGDIR not set");
}
path = rb_str_new2(dist);
}
if (chdir_blocking > 0) {
if (rb_thread_current() != chdir_thread)
rb_raise(rb_eRuntimeError, "conflicting chdir during another chdir block");
if (!rb_block_given_p())
rb_warn("conflicting chdir during another chdir block");
}
if (rb_block_given_p()) {
struct chdir_data args;
args.old_path = rb_str_encode_ospath(rb_dir_getwd());
args.new_path = path;
args.done = FALSE;
return rb_ensure(chdir_yield, (VALUE)&args, chdir_restore, (VALUE)&args);
}
else {
char *p = RSTRING_PTR(path);
int r = (int)(VALUE)rb_thread_call_without_gvl(nogvl_chdir, p,
RUBY_UBF_IO, 0);
if (r < 0)
rb_sys_fail_path(path);
}
return INT2FIX(0);
} Изменяет текущую рабочую директорию процесса на указанную строку. При вызове без аргумента, изменяет директорию на значение переменной окружения HOME, или LOGDIR. SystemCallError (вероятно, Errno::ENOENT), если целевая директория не существует.
Если указан блок, он получает имя новой текущей директории, и блок выполняется с ней в качестве текущей директории. Исходная рабочая директория восстанавливается при выходе из блока. Возвращаемое значение chdir — это значение блока. chdir блоки могут быть вложены, но в многопоточной программе будет выброшено исключение, если поток попытается открыть chdir блок, в то время как другой поток имеет его открытым, или если вызов chdir без блока произойдёт внутри блока, переданного chdir (даже в том же потоке).
Dir.chdir("/var/spool/mail")
puts Dir.pwd
Dir.chdir("/tmp") do
puts Dir.pwd
Dir.chdir("/usr") do
puts Dir.pwd
end
puts Dir.pwd
end
puts Dir.pwd
результат:
/var/spool/mail /tmp /usr /tmp /var/spool/mail
static VALUE
dir_s_children(int argc, VALUE *argv, VALUE io)
{
VALUE dir;
dir = dir_open_dir(argc, argv);
return rb_ensure(dir_collect_children, dir, dir_close, dir);
} Возвращает массив, содержащий все имена файлов, кроме “.” и “..” в данной директории. Вызовет SystemCallError, если указанной директории не существует.
Необязательный ключевой аргумент encoding указывает кодировку директории. Если не указан, используется кодировка файловой системы.
Dir.children("testdir") #=> ["config.h", "main.rb"]
static VALUE
dir_s_chroot(VALUE dir, VALUE path)
{
path = check_dirname(path);
if (chroot(RSTRING_PTR(path)) == -1)
rb_sys_fail_path(path);
return INT2FIX(0);
} Изменяет представление процесса о корне файловой системы. Только привилегированный процесс может выполнить этот вызов. Не доступен на всех платформах. В системах Unix, см. chroot(2) для получения дополнительной информации.
static VALUE
dir_s_rmdir(VALUE obj, VALUE dir)
{
const char *p;
int r;
dir = check_dirname(dir);
p = RSTRING_PTR(dir);
r = (int)(VALUE)rb_thread_call_without_gvl(nogvl_rmdir, (void *)p, RUBY_UBF_IO, 0);
if (r < 0)
rb_sys_fail_path(dir);
return INT2FIX(0);
} Удаляет указанную директорию. Вызовет подкласс SystemCallError, если директория не пуста.
static VALUE
dir_s_each_child(int argc, VALUE *argv, VALUE io)
{
VALUE dir;
RETURN_ENUMERATOR(io, argc, argv);
dir = dir_open_dir(argc, argv);
rb_ensure(dir_each_child, dir, dir_close, dir);
return Qnil;
} Вызывает блок один раз для каждой записи, кроме “.” и “..”, в указанной директории, передавая имя файла каждой записи в качестве параметра блоку.
Если блок не указан, возвращается итератор вместо этого.
Dir.each_child("testdir") {|x| puts "Got #{x}" }
результат:
Got config.h Got main.rb
static VALUE
rb_dir_s_empty_p(VALUE obj, VALUE dirname)
{
VALUE result, orig;
const char *path;
enum {false_on_notdir = 1};
FilePathValue(dirname);
orig = rb_str_dup_frozen(dirname);
dirname = rb_str_encode_ospath(dirname);
dirname = rb_str_dup_frozen(dirname);
path = RSTRING_PTR(dirname);
#if defined HAVE_GETATTRLIST && defined ATTR_DIR_ENTRYCOUNT
{
u_int32_t attrbuf[SIZEUP32(fsobj_tag_t)];
struct attrlist al = {ATTR_BIT_MAP_COUNT, 0, ATTR_CMN_OBJTAG,};
if (getattrlist(path, &al, attrbuf, sizeof(attrbuf), 0) != 0)
rb_sys_fail_path(orig);
if (*(const fsobj_tag_t *)(attrbuf+1) == VT_HFS) {
al.commonattr = 0;
al.dirattr = ATTR_DIR_ENTRYCOUNT;
if (getattrlist(path, &al, attrbuf, sizeof(attrbuf), 0) == 0) {
if (attrbuf[0] >= 2 * sizeof(u_int32_t))
return RBOOL(attrbuf[1] == 0);
if (false_on_notdir) return Qfalse;
}
rb_sys_fail_path(orig);
}
}
#endif
result = (VALUE)rb_thread_call_without_gvl(nogvl_dir_empty_p, (void *)path,
RUBY_UBF_IO, 0);
if (UNDEF_P(result)) {
rb_sys_fail_path(orig);
}
return result;
} Возвращает true если указанный файл — пустая директория, false если это не директория или она не пустая.
static VALUE
dir_entries(int argc, VALUE *argv, VALUE io)
{
VALUE dir;
dir = dir_open_dir(argc, argv);
return rb_ensure(dir_collect, dir, dir_close, dir);
} Возвращает массив, содержащий все имена файлов в данной директории. Вызовет SystemCallError, если указанной директории не существует.
Необязательный ключевой аргумент encoding указывает кодировку директории. Если не указан, используется кодировка файловой системы.
Dir.entries("testdir") #=> [".", "..", "config.h", "main.rb"]
VALUE
rb_file_directory_p(void)
{
} Возвращает true если указанный файл является директорией, false в противном случае.
static VALUE
dir_foreach(int argc, VALUE *argv, VALUE io)
{
VALUE dir;
RETURN_ENUMERATOR(io, argc, argv);
dir = dir_open_dir(argc, argv);
rb_ensure(dir_each, dir, dir_close, dir);
return Qnil;
} Вызывает блок один раз для каждой записи в указанной директории, передавая имя файла каждой записи в качестве параметра блоку.
Если блок не указан, возвращается итератор вместо этого.
Dir.foreach("testdir") {|x| puts "Got #{x}" }
результат:
Got . Got .. Got config.h Got main.rb
static VALUE
dir_s_getwd(VALUE dir)
{
return rb_dir_getwd();
} Возвращает путь к текущей рабочей директории этого процесса в виде строки.
Dir.chdir("/tmp") #=> 0
Dir.getwd #=> "/tmp"
Dir.pwd #=> "/tmp"
# File dir.rb, line 219 def self.glob(pattern, _flags = 0, flags: _flags, base: nil, sort: true) Primitive.dir_s_glob(pattern, flags, base, sort) end
Расширяет pattern, что является строкой шаблона или массивом строк шаблонов, и возвращает массив, содержащий соответствующие имена файлов. Если задан блок, вызывается блок один раз для каждого соответствующего имени файла, передавая имя файла в качестве параметра блоку.
Необязательный параметр base указывает базовый каталог для интерпретации относительных путей вместо текущего рабочего каталога. Поскольку результаты в этом случае не предваряются именем базового каталога, вам потребуется добавить имя базового каталога, если вам нужны реальные пути.
Результаты, соответствующие одиночным символам или наборам символов, сортируются в бинарном порядке по возрастанию, если не задан необязательный параметр false sort. Порядок массива строк шаблонов и фигурных скобок сохраняется.
Обратите внимание, что шаблон не является регулярным выражением, он ближе к оболочке glob. См. File::fnmatch для значения параметра flags. Чувствительность к регистру зависит от вашей системы (File::FNM_CASEFOLD игнорируется).
-
* -
Сопоставляет любой файл. Может быть ограничено другими значениями в glob. Эквивалентно
/.*/mxв регулярных выражениях.-
* -
Сопоставляет все файлы
-
c* -
Сопоставляет все файлы, начинающиеся с
c -
*c -
Сопоставляет все файлы, заканчивающиеся на
c -
*c* -
Сопоставляет все файлы, содержащие
c(включая начало или конец).
Обратите внимание, что это не будет сопоставлять скрытые файлы (dot-файлы) в стиле Unix. Чтобы включить их в результаты сопоставления, необходимо использовать флаг File::FNM_DOTMATCH или что-то вроде
"{*,.*}". -
-
** -
Сопоставляет каталоги рекурсивно, если за ним следует
/. Если этот сегмент пути содержит другие символы, он такой же, как обычно*. -
? -
Сопоставляет любой один символ. Эквивалентно
/.{1}/в регулярных выражениях. -
[set] -
Сопоставляет любой один символ в
set. Ведёт себя точно так же, как наборы символов вRegexp, включая отрицание набора ([^a-z]). -
{p,q} -
Сопоставляет либо
p, либоq. Эквивалентно альтернативному шаблону в регулярных выражениях.Сопоставляемые литералы могут иметь длину более одного символа. Можно указать более двух литералов.
-
\ -
Экранирует следующий метасимвол.
Обратите внимание, что это означает, что вы не можете использовать обратную косую черту в Windows в качестве части glob, т.е.
Dir["c:\foo*"]не сработает, используйтеDir["c:/foo*"]вместо этого.
Примеры:
Dir["config.?"] #=> ["config.h"]
Dir.glob("config.?") #=> ["config.h"]
Dir.glob("*.[a-z][a-z]") #=> ["main.rb"]
Dir.glob("*.[^r]*") #=> ["config.h"]
Dir.glob("*.{rb,h}") #=> ["main.rb", "config.h"]
Dir.glob("*") #=> ["config.h", "main.rb"]
Dir.glob("*", File::FNM_DOTMATCH) #=> [".", "config.h", "main.rb"]
Dir.glob(["*.rb", "*.h"]) #=> ["main.rb", "config.h"]
Dir.glob("**/*.rb") #=> ["main.rb",
# "lib/song.rb",
# "lib/song/karaoke.rb"]
Dir.glob("**/*.rb", base: "lib") #=> ["song.rb",
# "song/karaoke.rb"]
Dir.glob("**/lib") #=> ["lib"]
Dir.glob("**/lib/**/*.rb") #=> ["lib/song.rb",
# "lib/song/karaoke.rb"]
Dir.glob("**/lib/*.rb") #=> ["lib/song.rb"]
static VALUE
dir_s_home(int argc, VALUE *argv, VALUE obj)
{
VALUE user;
const char *u = 0;
rb_check_arity(argc, 0, 1);
user = (argc > 0) ? argv[0] : Qnil;
if (!NIL_P(user)) {
SafeStringValue(user);
rb_must_asciicompat(user);
u = StringValueCStr(user);
if (*u) {
return rb_home_dir_of(user, rb_str_new(0, 0));
}
}
return rb_default_home_dir(rb_str_new(0, 0));
} Возвращает домашний каталог текущего пользователя или указанного пользователя, если он задан.
static VALUE
dir_s_mkdir(int argc, VALUE *argv, VALUE obj)
{
struct mkdir_arg m;
VALUE path, vmode;
int r;
if (rb_scan_args(argc, argv, "11", &path, &vmode) == 2) {
m.mode = NUM2MODET(vmode);
}
else {
m.mode = 0777;
}
path = check_dirname(path);
m.path = RSTRING_PTR(path);
r = (int)(VALUE)rb_thread_call_without_gvl(nogvl_mkdir, &m, RUBY_UBF_IO, 0);
if (r < 0)
rb_sys_fail_path(path);
return INT2FIX(0);
} Создаёт новую папку с именем string, с правами доступа, заданными необязательным параметром anInteger. Права доступа могут быть изменены значением File::umask, и игнорируются в NT. Вызывает исключение SystemCallError, если папку нельзя создать. См. также обсуждение прав доступа в документации класса File.
Dir.mkdir(File.join(Dir.home, ".foo"), 0700) #=> 0
# File lib/tmpdir.rb, line 86
def self.mktmpdir(prefix_suffix=nil, *rest, **options)
base = nil
path = Tmpname.create(prefix_suffix || "d", *rest, **options) {|path, _, _, d|
base = d
mkdir(path, 0700)
}
if block_given?
begin
yield path.dup
ensure
unless base
stat = File.stat(File.dirname(path))
if stat.world_writable? and !stat.sticky?
raise ArgumentError, "parent directory is world writable but not sticky"
end
end
FileUtils.remove_entry path
end
else
path
end
end Dir.mktmpdir создаёт временную папку.
Папка создаётся с правами доступа 0700. Приложение не должно изменять права доступа, чтобы сделать временную папку доступной другим пользователям.
Префикс и суффикс имени папки задаются необязательным первым аргументом prefix_suffix.
-
Если он не указан или равен nil, используется «d» в качестве префикса и нет суффикса.
-
Если это строка, она используется в качестве префикса и нет суффикса.
-
Если это массив, первый элемент используется в качестве префикса, а второй - в качестве суффикса.
Dir.mktmpdir {|dir| dir is ".../d..." }
Dir.mktmpdir("foo") {|dir| dir is ".../foo..." }
Dir.mktmpdir(["foo", "bar"]) {|dir| dir is ".../foo...bar" }
Папка создаётся в Dir.tmpdir или необязательном втором аргументе tmpdir, если задано ненулевое значение.
Dir.mktmpdir {|dir| dir is "#{Dir.tmpdir}/d..." }
Dir.mktmpdir(nil, "/var/tmp") {|dir| dir is "/var/tmp/d..." }
Если задан блок, он вызывается с путём к папке. Папка и её содержимое удаляются с помощью FileUtils.remove_entry перед тем, как Dir.mktmpdir возвращает значение. Возвращается значение блока.
Dir.mktmpdir {|dir|
# use the directory...
open("#{dir}/foo", "w") { something using the file }
}
Если блок не задан, возвращается путь к папке. В этом случае, Dir.mktmpdir не удаляет папку.
dir = Dir.mktmpdir
begin
# use the directory...
open("#{dir}/foo", "w") { something using the file }
ensure
# remove the directory.
FileUtils.remove_entry dir
end
# File dir.rb, line 118 def initialize(name, encoding: nil) Primitive.dir_initialize(name, encoding) end
Возвращает новый объект каталога для указанного каталога.
Необязательный параметр encoding указывает кодировку каталога. Если не указано, используется кодировка файловой системы.
# File dir.rb, line 97
def self.open(name, encoding: nil, &block)
dir = Primitive.dir_s_open(name, encoding)
if block
begin
yield dir
ensure
Primitive.dir_s_close(dir)
end
else
dir
end
end Необязательный параметр encoding указывает кодировку каталога. Если не указано, используется кодировка файловой системы.
Без блока open является синонимом Dir::new. Если блок присутствует, он получает aDir в качестве параметра. Каталог закрывается в конце блока, и Dir::open возвращает значение блока.
static VALUE
dir_s_getwd(VALUE dir)
{
return rb_dir_getwd();
} Возвращает путь к текущему рабочему каталогу этого процесса в виде строки.
Dir.chdir("/tmp") #=> 0
Dir.getwd #=> "/tmp"
Dir.pwd #=> "/tmp"
static VALUE
dir_s_rmdir(VALUE obj, VALUE dir)
{
const char *p;
int r;
dir = check_dirname(dir);
p = RSTRING_PTR(dir);
r = (int)(VALUE)rb_thread_call_without_gvl(nogvl_rmdir, (void *)p, RUBY_UBF_IO, 0);
if (r < 0)
rb_sys_fail_path(dir);
return INT2FIX(0);
} Удаляет указанную папку. Вызывает исключение, являющееся подклассом SystemCallError, если папка не пуста.
# File lib/tmpdir.rb, line 21
def self.tmpdir
['TMPDIR', 'TMP', 'TEMP', ['system temporary path', @@systmpdir], ['/tmp']*2, ['.']*2].find do |name, dir|
unless dir
next if !(dir = ENV[name]) or dir.empty?
end
dir = File.expand_path(dir)
stat = File.stat(dir) rescue next
case
when !stat.directory?
warn "#{name} is not a directory: #{dir}"
when !stat.writable?
warn "#{name} is not writable: #{dir}"
when stat.world_writable? && !stat.sticky?
warn "#{name} is world-writable: #{dir}"
else
break dir
end
end or raise ArgumentError, "could not find a temporary directory"
end Возвращает временный путь к файлу операционной системы.
static VALUE
dir_s_rmdir(VALUE obj, VALUE dir)
{
const char *p;
int r;
dir = check_dirname(dir);
p = RSTRING_PTR(dir);
r = (int)(VALUE)rb_thread_call_without_gvl(nogvl_rmdir, (void *)p, RUBY_UBF_IO, 0);
if (r < 0)
rb_sys_fail_path(dir);
return INT2FIX(0);
} Удаляет указанную папку. Вызывает исключение, являющееся подклассом SystemCallError, если папка не пуста.
Методы экземпляра публичного доступа
static VALUE
dir_collect_children(VALUE dir)
{
VALUE ary = rb_ary_new();
dir_each_entry(dir, rb_ary_push, ary, TRUE);
return ary;
} Возвращает массив, содержащий все имена файлов, кроме «.» и «..» в этом каталоге.
d = Dir.new("testdir")
d.children #=> ["config.h", "main.rb"]
static VALUE
dir_close(VALUE dir)
{
struct dir_data *dirp;
dirp = dir_get(dir);
if (!dirp->dir) return Qnil;
closedir(dirp->dir);
dirp->dir = NULL;
return Qnil;
} Закрывает поток каталога. Вызов этого метода для закрытого объекта Dir игнорируется начиная с Ruby 2.3.
d = Dir.new("testdir")
d.close #=> nil
static VALUE
dir_each(VALUE dir)
{
RETURN_ENUMERATOR(dir, 0, 0);
return dir_each_entry(dir, dir_yield, Qnil, FALSE);
} Вызывает блок один раз для каждой записи в этом каталоге, передавая имя файла каждой записи в качестве параметра блоку.
Если блок не указан, возвращается перечислитель.
d = Dir.new("testdir")
d.each {|x| puts "Got #{x}" }
Результат:
Got . Got .. Got config.h Got main.rb
static VALUE
dir_each_child_m(VALUE dir)
{
RETURN_ENUMERATOR(dir, 0, 0);
return dir_each_entry(dir, dir_yield, Qnil, TRUE);
} Вызывает блок один раз для каждой записи, кроме «.» и «..» в этом каталоге, передавая имя файла каждой записи в качестве параметра блоку.
Если блок не указан, возвращается перечислитель.
d = Dir.new("testdir")
d.each_child {|x| puts "Got #{x}" }
Результат:
Got config.h Got main.rb
static VALUE
dir_fileno(VALUE dir)
{
struct dir_data *dirp;
int fd;
GetDIR(dir, dirp);
fd = dirfd(dirp->dir);
if (fd == -1)
rb_sys_fail("dirfd");
return INT2NUM(fd);
} Возвращает дескриптор файла, используемый в dir.
d = Dir.new("..")
d.fileno #=> 8
Этот метод использует функцию dirfd(), определённую POSIX 2008. NotImplementedError генерируется на других платформах, таких как Windows, которые не предоставляют эту функцию.
static VALUE
dir_inspect(VALUE dir)
{
struct dir_data *dirp;
TypedData_Get_Struct(dir, struct dir_data, &dir_data_type, dirp);
if (!NIL_P(dirp->path)) {
VALUE str = rb_str_new_cstr("#<");
rb_str_append(str, rb_class_name(CLASS_OF(dir)));
rb_str_cat2(str, ":");
rb_str_append(str, dirp->path);
rb_str_cat2(str, ">");
return str;
}
return rb_funcallv(dir, idTo_s, 0, 0);
} Возвращает строку, описывающую этот объект Dir.
static VALUE
dir_path(VALUE dir)
{
struct dir_data *dirp;
TypedData_Get_Struct(dir, struct dir_data, &dir_data_type, dirp);
if (NIL_P(dirp->path)) return Qnil;
return rb_str_dup(dirp->path);
} Возвращает путь, переданный в конструктор dir.
d = Dir.new("..")
d.path #=> ".."
Возвращает текущую позицию в dir. См. также Dir#seek.
d = Dir.new("testdir")
d.tell #=> 0
d.read #=> "."
d.tell #=> 12
static VALUE
dir_set_pos(VALUE dir, VALUE pos)
{
dir_seek(dir, pos);
return pos;
} Синоним для Dir#seek, но возвращает параметр позиции.
d = Dir.new("testdir") #=> #<Dir:0x401b3c40>
d.read #=> "."
i = d.pos #=> 12
d.read #=> ".."
d.pos = i #=> 12
d.read #=> ".."
static VALUE
dir_read(VALUE dir)
{
struct dir_data *dirp;
struct dirent *dp;
GetDIR(dir, dirp);
errno = 0;
if ((dp = READDIR(dirp->dir, dirp->enc)) != NULL) {
return rb_external_str_new_with_enc(dp->d_name, NAMLEN(dp), dirp->enc);
}
else {
int e = errno;
if (e != 0) rb_syserr_fail(e, 0);
return Qnil; /* end of stream */
}
} Читает следующую запись из dir и возвращает её как строку. Возвращает nil в конце потока.
d = Dir.new("testdir")
d.read #=> "."
d.read #=> ".."
d.read #=> "config.h"
static VALUE
dir_rewind(VALUE dir)
{
struct dir_data *dirp;
GetDIR(dir, dirp);
rewinddir(dirp->dir);
return dir;
} Перемещает dir к первой записи.
d = Dir.new("testdir")
d.read #=> "."
d.rewind #=> #<Dir:0x401b3fb0>
d.read #=> "."
static VALUE
dir_seek(VALUE dir, VALUE pos)
{
struct dir_data *dirp;
long p = NUM2LONG(pos);
GetDIR(dir, dirp);
seekdir(dirp->dir, p);
return dir;
} Перемещает указатель в dir на определённую позицию. Целое число должно быть значением, возвращаемым методом Dir#tell.
d = Dir.new("testdir") #=> #<Dir:0x401b3c40>
d.read #=> "."
i = d.tell #=> 12
d.read #=> ".."
d.seek(i) #=> #<Dir:0x401b3c40>
d.read #=> ".."
static VALUE
dir_tell(VALUE dir)
{
struct dir_data *dirp;
long pos;
GetDIR(dir, dirp);
pos = telldir(dirp->dir);
return rb_int2inum(pos);
} Возвращает текущую позицию в dir. См. также Dir#seek.
d = Dir.new("testdir")
d.tell #=> 0
d.read #=> "."
d.tell #=> 12
Возвращает путь, переданный в конструктор dir.
d = Dir.new("..")
d.path #=> ".."
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.