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!
-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.
win32-dir 0.3.1 coming soon…
Thanks,
Dan