From: RRRoy BBBean Date: 2016-10-16T14:29:23-05:00 Subject: [ruby-core:77638] Re: [Ruby trunk Feature#12843] Proposal to add a new method to class File in order to determine the name of the file without any suffix I seem to always use basename, extname, ... in several lines of code to get want I need, most the elements needed to move and/or rename a file. Could there be one method that provides all the elements of a filename in one call? something like: File.explode_name( '...' ) => [ fdrive, fpath, fname, fext ] where any of these four fields can be nil (or empty) to match the situation "", "/User/MyName/MyDir/", "MyFile", ".myext" = File.explode_name '/User/MyName/MyDir/MyFile.myext' "C:", "/User/MyName/MyDir/", "", "" = File.explode_name 'C:/User/MyName/MyDir/' etc. If not in the core, can something like this belong in the Facets gem, File class methods? If I can take it a step further, could fpath be an array of strings (path segments, aka subdirectories)? Is this even useful? On 10/16/2016 05:39 AM, shevegen@gmail.com wrote: > Issue #12843 has been reported by Robert A. Heiler. > > ---------------------------------------- > Feature #12843: Proposal to add a new method to class File in order to determine the name of the file without any suffix > https://bugs.ruby-lang.org/issues/12843 > > * Author: Robert A. Heiler > * Status: Open > * Priority: Normal > * Assignee: > ---------------------------------------- > We currently have File.basename() and File.dirname(), both of which > work very well and are quite useful when working with files and > directories. > > When you want to get the filename without extension, you can use > something like this: > > File.basename('foo/bar/test.rb', '.rb') > File.basename('foo/bar/test.rb', '.*') > > While this works very well, I was wondering if it would be possible > to add a method that does precisely that for you but which requires > only one argument - the path. That would allow us to omit the ',' > and the second argument, which I think would be nice to have. > > Resulting ruby code may be a tiny bit shorter: > > File.basename('foo/bar/test.rb', '.*') > File.methodXY('foo/bar/test.rb') > > Where .methodXY() should be the name of the new method added. > > I would thus like to suggest a way for a new method addition, on the > class File namespace, just like .basename() and .dirname(), that will > return the filename of a given path/file, but without any suffix and > without any path - so, similar to File.basename() but to additionally > already chop away all extname suffixes. > > Giving things a proper, meaningful name is often difficult. In > particular when method names should ideally be short; both > .dirname and .basename are quite short too. > > My obvious choice would be: > > File.filename() > > But I am not sure if this is a good name. A problem is that I > can not come up with a better name. > > We also already have File.extname() in order to determine the > "extension name" of the file. > > https://ruby-doc.org/core-2.2.0/File.html#method-c-extname > > So we essentially have 3 behaviours - obtain the name of the > directory via .dirname; obtain the name of the file/entry itself, > via .basename; and being able to obtain the name of the extension > via .extname. > > What we actually appear to be missing is to obtain the part > of the name of a path/file/directory WITHOUT the extension > and WITHOUT the leading dirname part. > > If File.filename() is not a good name then perhaps any of the > following may serve as better alternatives; some are obviously > not really great names though, I add them mostly for comparison: > > File.no_suffix() > File.corename() > File.corefile() > File.shortname() > File.short_name() > File.sname() > File.filename_without_extension() # Probably too verbose but > # probably more descriptive than the other names > > Anyway, I guess the name of the method is one thing - if the > functionality itself would be approved, then I am sure a good > name can be found for the functionality anyway if none of > the above are very good choices. I just thought that it should > fit towards .dirname .basename and .extname, hence why I put > .filename first. > > Thanks for reading! > > > Unsubscribe: