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

···

--
Lars Roland

lroland@gmail.com 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

lroland@gmail.com 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

--
Lars Roland

You could try:

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

Cheers
Chris

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

···

On Mon, 16 Oct 2006, Daniel Berger wrote:

lroland@gmail.com 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?

--
my religion is very simple. my religion is kindness. -- the dalai lama

Hi,

At Mon, 16 Oct 2006 23:19:30 +0900,
ara.t.howard@noaa.gov 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}

···

--
Nobu Nakada

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

···

ara.t.howard@noaa.gov wrote:

On Mon, 16 Oct 2006, Daniel Berger wrote:

lroland@gmail.com 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?

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

<snip>

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

win32-dir 0.3.1 coming soon....

Thanks,

Dan

···

ara.t.howard@noaa.gov wrote:

On Mon, 16 Oct 2006, Daniel Berger wrote:

> lroland@gmail.com 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?

that'll crawl if a directory is huge though

nice. double negation is always good!

-a

···

On Tue, 17 Oct 2006, Nobuyoshi Nakada wrote:

Hi,

At Mon, 16 Oct 2006 23:19:30 +0900,
ara.t.howard@noaa.gov 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}

--
my religion is very simple. my religion is kindness. -- the dalai lama

Hi,

Nobuyoshi Nakada <nobu@ruby-lang.org> writes:

At Mon, 16 Oct 2006 23:19:30 +0900,
ara.t.howard@noaa.gov 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 == "..."

···

--
eban

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

-a

···

On Tue, 17 Oct 2006, John Turner wrote:
--
my religion is very simple. my religion is kindness. -- the dalai lama

WATANABE Hirofumi wrote:

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

Dir.entries(dirname).size == 2

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

···

--
       vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407