What is best idiom to remove file extension

What is the most concise, bulletproof idiom for removing the file
extension from a file? Maybe I've missed something obvious that
everyone else uses...

Here's what I usually do:

This is what I usually use if I want bulletproof:
  filename.sub(/#{Regexp.escape(File.extname(filename))}$/, '')

I use something like this when I want something quick:
  filename.sub(/\.\w$/,'')

One could imagine doing something like this, but it is comical how
much code it takes:
  File.join( File.dirname(filename), File.basename(filename,
File.extname(filename)))

What do you use for this (seemingly) trivial task?

Thanks,
John

Don't forget about the 2nd argument to File.basename:

File.basename(file, File.extname(file))

If you need to guarantee the full path:

File.expand_path(File.basename(file, File.extname(file))

Regards,

Dan

···

On Feb 23, 3:39 pm, bwv549 <jtpri...@gmail.com> wrote:

What is the most concise, bulletproof idiom for removing the file
extension from a file? Maybe I've missed something obvious that
everyone else uses...

Here's what I usually do:

This is what I usually use if I want bulletproof:
filename.sub(/#{Regexp.escape(File.extname(filename))}$/, '')

I use something like this when I want something quick:
filename.sub(/\.\w$/,'')

One could imagine doing something like this, but it is comical how
much code it takes:
File.join( File.dirname(filename), File.basename(filename,
File.extname(filename)))

bwv549 wrote:

What is the most concise, bulletproof idiom for removing the file
extension from a file? Maybe I've missed something obvious that
everyone else uses...

Here's what I usually do:

This is what I usually use if I want bulletproof:
  filename.sub(/#{Regexp.escape(File.extname(filename))}$/, '')

How about:

name = fname.chomp(File.extname(fname) )

···

--
Posted via http://www.ruby-forum.com/\.

7stud -- wrote:

How about:

name = fname.chomp(File.extname(fname) )

name = fname.chomp(File.extname(fname) ) <------

name = fname[/.*(?=\..+$)/] <--------------

···

--
Posted via http://www.ruby-forum.com/\.

All great answers - much better than what I was doing before.

To summarize then...

full pathname with no extension:
    File.expand_path(File.basename(fname, File.extname(fname))

easy to remember and read:
    fname.chomp(File.extname(fname) )

shortest:
    fname[/.*(?=\..+$)/]

Thanks all!

You can also use:

File.basename('foo.bar', '.*')
# "foo"

^ manveru

···

On Tue, Feb 24, 2009 at 9:09 AM, bwv549 <jtprince@gmail.com> wrote:

All great answers - much better than what I was doing before.

To summarize then...

full pathname with no extension:
File.expand_path(File.basename(fname, File.extname(fname))

easy to remember and read:
fname.chomp(File.extname(fname) )

shortest:
fname[/.*(?=\..+$)/]

All great answers - much better than what I was doing before.

To summarize then...

full pathname with no extension:
File.expand_path(File.basename(fname, File.extname(fname))

easy to remember and read:
fname.chomp(File.extname(fname) )

shortest:
fname[/.*(?=\..+$)/]

Note that you've lost your robustness with that last:

fname = '.vimrc'

=> ".vimrc"

fname[/.*(?=\..+$)/]

=> ""

fname.chomp(File.extname(fname) )

=> ".vimrc"

martin

···

On Tue, Feb 24, 2009 at 5:39 AM, bwv549 <jtprince@gmail.com> wrote:

Be aware if it gets the result you want:
File.basename('foo.tar.gz', '.*')
# => "foo.tar"

However,
Jan Friedrich

···

Michael Fellinger <m.fellinger@gmail.com> wrote:

On Tue, Feb 24, 2009 at 9:09 AM, bwv549 <jtprince@gmail.com> wrote:
You can also use:

File.basename('foo.bar', '.*')
# "foo"

> full pathname with no extension:
> File.expand_path(File.basename(fname, File.extname(fname))

File.basename(fname, '.*') would be shorter. It also handles file names like
".vimrc" correctly.

···

--
The end is here -->

Another summary is due:

Shortest, rock-solid idiom for removing the extension, without
removing the preceding path:

  fname.chomp(File.extname(fname))

Best idiom if you are removing the path also:

  File.basename(fname, '.*')

It is unfortunate that these are so dissimilar, but both are easy to
remember and concise, so no problem. Thanks again for everyone's help
on this.