Test if Directory is Empty

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

[email protected] wrote:

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

On Mon, 16 Oct 2006, Daniel B. wrote:

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

Hi,

At Mon, 16 Oct 2006 23:19:30 +0900,
[email protected] wrote in [ruby-talk:220018]:

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}

On Tue, 17 Oct 2006, Nobuyoshi N. wrote:

Hi,

At Mon, 16 Oct 2006 23:19:30 +0900,
[email protected] wrote in [ruby-talk:220018]:

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}

nice. double negation is always good!

-a

Hi,

Nobuyoshi N. [email protected] writes:

At Mon, 16 Oct 2006 23:19:30 +0900,
[email protected] wrote in [ruby-talk:220018]:

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}

Dir.entries(dirname).join == “…”

[email protected] wrote:


Lars R.

You could try:

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

Cheers
Chris

[email protected] wrote:

empty =

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

WATANABE Hirofumi wrote:

Dir.entries(dirname).join == “…”

Dir.entries(dirname).size == 2

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

On Tue, 17 Oct 2006, John T. wrote:

not sure what you mean there - that’s the correct usage… read the ri
for
catch.

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! :wink:

-a

[email protected] wrote:

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

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

win32-dir 0.3.1 coming soon…

Thanks,

Dan