Project

General

Profile

Actions

Feature #5994

closed

Dir.glob without wildcards returns pattern, not filename

Added by daz (Dave B) over 12 years ago. Updated over 10 years ago.

Status:
Closed
Target version:
[ruby-core:42469]

Description

This is Windows specific, I guess, as filename case doesn't matter there.
Ruby version is not specific to 1.9.3p0 (ruby 1.8.7p334 gives the same).
The script below produces results that seem inconsistent.
Using special characters (wildcards) in the glob pattern returns the
actual filename on disk but a plain pattern (no wildcards) returns the
pattern itself. This means I have to use another method for producing
a file with the same name or else override the users case-style
preference (which is not my intention).

daz

#======================
puts 'ruby %sp%d (%s) [%s]' % [RUBY_VERSION, RUBY_PATCHLEVEL, RUBY_RELEASE_DATE, RUBY_PLATFORM]
# ruby 1.9.3p0 (2011-10-30) [i386-mingw32]

Dir.chdir ENV['TEMP']
TMPDIR = Time.now.strftime('%Y%m%d_%H%M%S_delete')
Dir.mkdir(TMPDIR)
Dir.chdir(TMPDIR)

TMPFN  = 'Foo'
File.open(TMPFN, 'w') {}

#----------------------------------------------
p Dir.glob('*')   #=> ["Foo"]  ok
p Dir.glob('f?O') #=> ["Foo"]  ok

# But a glob without special characters returns
#  the glob pattern instead of the filename
p Dir.glob('foO') #=> ["foO"]  not wanted
p Dir['foO']      #=> ["foO"]  same as above
p Dir.glob('foO', File::FNM_CASEFOLD)
                # casefold ignored, as docs say
#----------------------------------------------

File.delete(TMPFN)
Dir.delete(File.join('..', TMPDIR))


#+++++
# Same incorrect results from:
#   ruby 1.8.7p334 (2011-02-18) [i386-mingw32]


Related issues 1 (0 open1 closed)

Related to Ruby master - Bug #10015: Performance regression in Dir#[]ClosedActions

Updated by daz (Dave B) over 12 years ago

This *nix behaviour would be fine, for me.

# ruby 1.8.7p302 (2010-08-16) [i486-linux]
#-----------------------------------------------------
p Dir.glob('*')                        #=> ["Foo"]  ok
p Dir.glob('f?O')                      #=> []       ok
p Dir.glob('foO')                      #=> []       ok
p Dir.glob('foO', File::FNM_CASEFOLD)  #=> ["Foo"]  ok
#-----------------------------------------------------

( Couldn't find an ENV['TEMP'] .. used ENV['HOME'] )

daz

Updated by nobu (Nobuyoshi Nakada) over 12 years ago

  • Category set to core
  • Status changed from Open to Feedback
  • Target version set to 2.0.0

Dave B wrote:

p Dir.glob('foO') #=> ["foO"]  not wanted

What do you want, an empty array same as case-sensitive systems?

Updated by daz (Dave B) over 12 years ago

Hi Nobu,

I expected:

p Dir.glob('foO') #=> ["Foo"]

The current behaviour would be difficult to justify.
The doc string says ...
"Returns the filenames found by expanding pattern ..."

There is no filename "foO"; it exists only as a glob pattern.

Instead of answering the question "Are there files which match this
pattern", it has answered an artificial question "What glob pattern
did I use to search for files"; I already knew the answer to that. ;)

Background:
I'm doing a Windows System Restore from Linux and the registry databases
are not things I want to make subtle changes to.

WINDIR   = '/media/XYSRES/WINDOWS'
CONFIG   = File.join( WINDIR, 'system32', 'config' )
Dir.chdir CONFIG

hives = %w{ system software sam security default }

# Can't do this ...
p HIVES_NO = hives.map {|vn| Dir[vn][0] }
#=> ["system", "software", "sam", "security", "default"]

# Have to do this, instead ...
p HIVES_OK = Dir['*'].delete_if {|fn| !hives.include?(fn.downcase)}
#=> ["default", "SAM", "SECURITY", "software", "system"]

Cheers,

daz

Updated by ko1 (Koichi Sasada) about 12 years ago

  • Status changed from Feedback to Assigned
  • Assignee set to nobu (Nobuyoshi Nakada)

nobu, could you reply to it?

Actions #5

Updated by nobu (Nobuyoshi Nakada) almost 12 years ago

  • Tracker changed from Bug to Feature

Updated by ko1 (Koichi Sasada) over 11 years ago

  • Target version changed from 2.0.0 to 2.1.0

ping -> nobu

Updated by hsbt (Hiroshi SHIBATA) almost 11 years ago

  • Target version changed from 2.1.0 to 2.2.0

Updated by nobu (Nobuyoshi Nakada) almost 11 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

Applied in changeset r44796.


dir.c: glob cases on case-insensitive system

  • dir.c (glob_helper): return the filename with actual cases on
    the filesystem if it is case-insensitive. [ruby-core:42469]
    [Feature #5994]

Updated by nobu (Nobuyoshi Nakada) over 10 years ago

  • Description updated (diff)
Actions #10

Updated by nobu (Nobuyoshi Nakada) over 8 years ago

  • Related to Bug #10015: Performance regression in Dir#[] added
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0