Test if Directory is Empty

L

lroland

Hi all

I browsed through the FileUtils and Dir documentation and found no
obvious way to test if a directory exists and is empty. Various hacks
can be used (like checking file count and size, testing if the
directory can be deleted..) but they all left me wondering if i some
how missed a Dir.isEmpty? like method ?

So in short is there a real Ruby way of telling whether a directory if
empty
 
D

Daniel Berger

Hi all

I browsed through the FileUtils and Dir documentation and found no
obvious way to test if a directory exists and is empty. Various hacks
can be used (like checking file count and size, testing if the
directory can be deleted..) but they all left me wondering if i some
how missed a Dir.isEmpty? like method ?

So in short is there a real Ruby way of telling whether a directory if
empty

if Dir["/foo/bar/*"].empty?

Regards,

Dan
 
A

ara.t.howard

Hi all

I browsed through the FileUtils and Dir documentation and found no
obvious way to test if a directory exists and is empty. Various hacks
can be used (like checking file count and size, testing if the
directory can be deleted..) but they all left me wondering if i some
how missed a Dir.isEmpty? like method ?

So in short is there a real Ruby way of telling whether a directory if
empty

if Dir["/foo/bar/*"].empty?

that'll crawl if a directory is huge though... i've used this


d = "the_dir"

empty =
catch("empty"){
Dir.glob("#{ d }/*"){ throw "empty", false } # if we find any file return false
Dir.glob("#{ d }/.*"){ throw "empty", false } # if we find any dotfile/hidden return false
throw "empty", true # otherwise return true
}

which someone will probably compact... note that it returns false when the
first file/dotfile is found.

cheers.

-a
 
N

Nobuyoshi Nakada

Hi,

At Mon, 16 Oct 2006 23:19:30 +0900,
which someone will probably compact... note that it returns false when the
first file/dotfile is found.

!Dir.foreach(dirname) {|n| break true unless /\A\.\.?\z/ =~ n}
!Dir.enum_for:)foreach, dirname).any? {|n| /\A\.\.?\z/ !~ n}
 
A

ara.t.howard

Hi,

At Mon, 16 Oct 2006 23:19:30 +0900,


!Dir.foreach(dirname) {|n| break true unless /\A\.\.?\z/ =~ n}
!Dir.enum_for:)foreach, dirname).any? {|n| /\A\.\.?\z/ !~ n}

nice. double negation is always good!

-a
 
W

WATANABE Hirofumi

Hi,

Nobuyoshi Nakada said:
At Mon, 16 Oct 2006 23:19:30 +0900,


!Dir.foreach(dirname) {|n| break true unless /\A\.\.?\z/ =~ n}
!Dir.enum_for:)foreach, dirname).any? {|n| /\A\.\.?\z/ !~ n}

Dir.entries(dirname).join == "..."
 
C

ChrisH

Hi all

I browsed through the FileUtils and Dir documentation and found no
obvious way to test if a directory exists and is empty. Various hacks
can be used (like checking file count and size, testing if the
directory can be deleted..) but they all left me wondering if i some
how missed a Dir.isEmpty? like method ?

So in short is there a real Ruby way of telling whether a directory if
empty

You could try:

class Dir
def Dir.isEmpty?(path)
Dir.entries(path) == [".", ".."]
end
end

Cheers
Chris
 
J

Joel VanderWerf

WATANABE said:
Dir.entries(dirname).join == "..."

Dir.entries(dirname).size == 2

But this still has the disadvantage that Ara mentioned for huge dirs...
 
J

John Turner

Hi all

I browsed through the FileUtils and Dir documentation and found no
obvious way to test if a directory exists and is empty. Various hacks
can be used (like checking file count and size, testing if the
directory can be deleted..) but they all left me wondering if i some
how missed a Dir.isEmpty? like method ?

So in short is there a real Ruby way of telling whether a directory if
empty

if Dir["/foo/bar/*"].empty?

that'll crawl if a directory is huge though... i've used this


d = "the_dir"

empty =
catch("empty"){
Dir.glob("#{ d }/*"){ throw "empty", false } # if we find any
file return false
Dir.glob("#{ d }/.*"){ throw "empty", false } # if we find any
dotfile/hidden return false
throw "empty", true # otherwise return true
}

which someone will probably compact... note that it returns false when the
first file/dotfile is found.

cheers.

-a

Not sure about using throw to return values there... Also, won't the
"Dir.glob("#{ d }/.*")" return [".", ".."] (well, pass "." to the block)
and break this?

How about:

def isEmpty?(dir)
Dir.glob("#{dir}/*", File::FNM_DOTMATCH) do |f|
return false unless f =~ /\.\.?/
end
return true
end
 
D

Daniel Berger

Hi all

I browsed through the FileUtils and Dir documentation and found no
obvious way to test if a directory exists and is empty. Various hacks
can be used (like checking file count and size, testing if the
directory can be deleted..) but they all left me wondering if i some
how missed a Dir.isEmpty? like method ?

So in short is there a real Ruby way of telling whether a directory if
empty

if Dir["/foo/bar/*"].empty?

that'll crawl if a directory is huge though

<snip>

True. Oh, look - Windows has a PathIsDirectoryEmpty() function. :)

win32-dir 0.3.1 coming soon....

Thanks,

Dan
 
A

ara.t.howard

On Tue, 17 Oct 2006, John Turner wrote:


not sure what you mean there - that's the correct usage... read the ri for
catch.
Also, won't the "Dir.glob("#{ d }/.*")" return [".", ".."] (well, pass "."
to the block) and break this?

How about:

def isEmpty?(dir)
Dir.glob("#{dir}/*", File::FNM_DOTMATCH) do |f|
return false unless f =~ /\.\.?/
end
return true
end

yes. that's definitely better...

that regex is deadly though:

harp:~ > irb
irb(main):001:0> "this is a file ..." =~ /\.\.?/ ? true : false
=> true

refining some of the ideas in the thread:


harp:~ > cat a.rb
class Dir
def empty?
Dir.glob("#{ path }/*", File::FNM_DOTMATCH) do |e|
return false unless %w( . .. ).include?(File::basename(e))
end
return true
end
def self.empty? path
new(path).empty?
end
end

d = Dir.new '/tmp'
p d.empty?

require 'fileutils'
FileUtils.rm_f 'empty'
FileUtils.mkdir_p 'empty'
p(Dir.empty?('empty'))


harp:~ > ruby a.rb
false
true


now we can begin the discussion on how to use such a method - since nearly any
code that did would have a race condition! ;-)


-a
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,786
Messages
2,569,625
Members
45,321
Latest member
AlphonsoPi

Latest Threads

Top