APIdock / Ruby
/
method

basename

ruby latest stable - Class: File
basename(*args)
public

Returns the last component of the filename given in file_name (after first stripping trailing separators), which can be formed using both File::SEPARATOR and File::ALT_SEPARATOR as the separator when File::ALT_SEPARATOR is not nil. If suffix is given and present at the end of file_name, it is removed. If suffix is ".*", any extension will be removed.

File .basename ("/home/gumby/work/ruby.rb") #=> "ruby.rb"
File .basename ("/home/gumby/work/ruby.rb", ".rb") #=> "ruby"
File .basename ("/home/gumby/work/ruby.rb", ".*") #=> "ruby"
static VALUE
rb_file_s_basename(int argc, VALUE *argv)
{
 VALUE fname, fext, basename;
 const char *name, *p;
 long f, n;
 rb_encoding *enc;
 fext = Qnil;
 if (rb_check_arity(argc, 1, 2) == 2) {
 fext = argv[1];
 StringValue(fext);
 enc = check_path_encoding(fext);
 }
 fname = argv[0];
 FilePathStringValue(fname);
 if (NIL_P(fext) || !(enc = rb_enc_compatible(fname, fext))) {
 enc = rb_enc_get(fname);
 fext = Qnil;
 }
 if ((n = RSTRING_LEN(fname)) == 0 || !*(name = RSTRING_PTR(fname)))
 return rb_str_new_shared(fname);
 p = ruby_enc_find_basename(name, &f, &n, enc);
 if (n >= 0) {
 if (NIL_P(fext)) {
 f = n;
 }
 else {
 const char *fp;
 fp = StringValueCStr(fext);
 if (!(f = rmext(p, f, n, fp, RSTRING_LEN(fext), enc))) {
 f = n;
 }
 RB_GC_GUARD(fext);
 }
 if (f == RSTRING_LEN(fname)) return rb_str_new_shared(fname);
 }
 basename = rb_str_new(p, f);
 rb_enc_copy(basename, fname);
 OBJ_INFECT(basename, fname);
 return basename;
}

1Note

For the file path use File.dirname

metavida · Jan 27, 20103 thanks

File.dirname provides what File.basename omits.

AltStyle によって変換されたページ (->オリジナル) /