From: Robert Klemme Date: 2010-03-13T19:00:06+09:00 Subject: Re: Dir.glob problem On 03/13/2010 03:15 AM, Michael W Ryder wrote: > Joel VanderWerf wrote: >> Michael W Ryder wrote: >>> Michael W Ryder wrote: >>>> David Vlad wrote: >>>>> In the program Im making I need to read some wma files into a variable >>>>> and I did like this: >>>>> >>>>> songs = Dir.glob("C:\\Users\\Public\\Music\\Sample Music\\*.wma") >>>>> >>>>> Note that this is NOT the wrong directory, I've copy pasted it from >>>>> the >>>>> map itself and also the files are wma and nothing else. My programming >>>>> teacher has no idea why this dosnt work and the other ppl I've talked >>>>> with dosnt know either. Most said something like "aside from a simple >>>>> mistake like wrong directory/extension, I don't know what could be >>>>> going >>>>> wrong." So now this forum is my last resort, why on earth dosnt this >>>>> work?! >>>> The only way I could get it to work is to use the example at >>>> http://ruby-doc.org/core/classes/Dir.html and create a directory >>>> variable such as: lfiles=Files.join("C:", "Users", "Public", >>>> "Music", "Sample Music", "*.wma") and then use a=Dir.glob(lfiles). >>>> The only problem with that approach is that the entire path is added >>>> to each file. I don't know if this is a concern or not. >>> Further experimenting found two other solutions. The first is to use: >>> a=Dir.glob("C:/Users/Public/Music/Sample Music/*.wma") which has the >>> same "problem" as my first solution. >>> A better solution may be to use Dir.chdir to change to the directory >>> and then use Dir.glob to extract the file names. This has the >>> advantage of not including the path in front of each file name. >> >> chdir is not thread safe, it changes the pwd which is global to the >> process. Here's an alternative: >> >> d = Dir.new("/tmp") # use fwd slashes even on windows >> d.grep(/\.wma$/) >> >> This should give you an array of filenames in the dir. >> > > Is there a way to expand this to include subdirectories like .glob > allows? .grep doesn't appear to work on the string created by File.join. If you want to do globbing, include subdirectories and want to have relative paths. I would look at Pathname. You can, for example, generate relative paths via #relative_path_from: irb(main):025:0> Pathname("/var/log/foo").relative_path_from(Pathname("/var")) => # irb(main):026:0> Pathname("/var/log/foo").relative_path_from(Pathname("/var")).to_s => "log/foo" Pathname has also a method #find which yields Pathname instances to the block and can be used for things like this. Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/