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: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>