Help me clean up this method

(Daniel Sheppard) #1

This is cleaner to my eye, but YMMV.

class Dir
def size(name)
   Dir.chdir(name)
   Dir["**/*"].inject(0) do |total,name|
     total + (File.file?(name) ? File.size(name) : 0)
   end
end
end

Also, be aware that you're changing the working dir and not changing it
back.

Are there situations where Dir[name + "/**/*"] wouldn't work?

···

-----Original Message-----
From: Hristo Deshev [mailto:hristo.deshev@gmail.com]
Sent: Monday, 5 September 2005 2:45 PM
To: ruby-talk ML
Subject: Re: Help me clean up this method

On 9/5/05, Vincent Foley <vfoley@gmail.com> wrote:

Hello guys,

I wrote this little method to return the size of a given directory,
but I think it's very ugly. Could anyone help me clean it up a bit?

Hi guys,

I managed to get rid of the file names discovery by using Dir's globbing
facilities. The size calculation is then a matter of a single inject
call:

def Dir.size(name)
Dir.chdir(name)
files = Dir["**/*"]
files.inject(0) do |total, name|
if File.file?(name)
total + File.size(name)
else
total
end
end
end

puts Dir.size(".")
puts Dir.size("D:/tmp/ruby")
puts Dir.size("C:/Windows")

I don't like the "if" statement inside the block that gets injected. Is
there a better, idiomatic way to express the same thing?

Hristo Deshev

#####################################################################################
This email has been scanned by MailMarshal, an email content filter.
#####################################################################################

(Hristo Deshev) #2

Hi Daniel,

This is cleaner to my eye, but YMMV.

>class Dir
> def size(name)
> Dir.chdir(name)
> Dir["**/*"].inject(0) do |total,name|
> total + (File.file?(name) ? File.size(name) : 0)
> end
> end
>end

The ?: operator is indeed shorter. I am not sure if I like it better, but I
will stick with it. Maybe extracting the file or dir size calculation to a
separate method would be best.

Also, be aware that you're changing the working dir and not changing it

back.

Are there situations where Dir[name + "/**/*"] wouldn't work?

I can swear I tried that first and it did not return any files. Maybe I was
missing a slash somewhere. It now works like a charm. Thanks for pointing it
out.

Hristo Deshev

···

On 9/5/05, Daniel Sheppard <daniels@pronto.com.au> wrote:

(Wayne Vucenic) #3

Not to be picky, but most of the above examples need another rescue
statement or two. In particular, Dir.chdir(name) can throw an exception, at
least on Windows XP:

================ Errno::EACCES =====================
C:\Documents and Settings\All Users\Documents\test.rb:10:in `chdir'
Dir.chdir('c:/System Volume Information')
C:\Documents and Settings\All Users\Documents\test.rb:10
Dir.chdir('c:/System Volume Information')
c:\ruby\lib\ruby\site_ruby\1.8/rubygems/custom_require.rb:21:in `require__'
require__ path
c:\ruby\lib\ruby\site_ruby\1.8/rubygems/custom_require.rb:21:in `require'
require__ path

···

=============================================
Exception: Permission denied - c:/System Volume Information

Wayne Vucenic
No Bugs Software
Ruby and C++ Contract Programming in Silicon Valley