2011-02-20 34 views
27

如何在Ruby中檢查目錄是否爲空?有什麼樣:(我知道這功能不存在)檢查Ruby中的目錄是否爲空

​​

+2

我想看到一個名爲方法 「Dir.empty?」 –

+0

@BenFlynn 5年之後,你的願望[實現了](http://stackoverflow.com/a/41344613/2021397) – Janosch

+0

@Janosch無論是這個還是存在引力波的證據都是2016年最好的事情發生 –

回答

46

你可以得到的條目列表,看看自己是否是空的(當然,你必須說明「。」和「..」)。見the docs

(Dir.entries('your_directory') - %w{ . .. }).empty? 

# or using glob, which doesn't match hidden files (like . and ..) 
Dir['your_directory/*'].empty? 

更新:上面的第一種方法用於使用正則表達式;現在它不(顯然)。以下評論主要適用於前者(正則表達式)版本。

+0

第一個給了我錯誤,但第二個完美地工作。謝謝! –

+0

@Mark Szymanski:啊,是的,我用圓括號包住了這個塊。固定。 – coreyward

+0

第一個命令也會忽略隱藏文件,例如.git。 –

9

您可以使用記錄,看看目錄中的所有文件和文件夾:

Dir.entries('directory') 
=> ['.', '..', 'file.rb', '.git'] 
Dir.entries('directory').size <= 2 # Check if empty with no files or folders. 

您還可以搜索文件只能用水珠:

Dir.glob('directory/{*,.*}') 
=> ['file.rb', '.git'] 
Dir.glob('directory/{*,.*}').empty? # Check if empty with no files. 
+2

但是'Dir.glob('directory/*')'將省略以'.'開頭的文件,例如'。配置文件「或」.git「。 –

+0

@(畝太短) - 你是對的。我更新了我的正則表達式以包含隱藏的文件。 –

+3

Dir.glob('directory /{*,.*}')捕獲「。」和「..」這麼空?將始終返回false。 –

3

一個空的目錄應該只有兩個鏈接(。和..)。在OSX上,它的工作原理如下:

File.stat('directory').nlink == 2 

...但在Linux或Cygwin上不起作用。 (謝謝@DamianNowak)調整潘的回答:

Dir.entries('directory').size == 2 

應該工作。

+1

'nlink'檢查子目錄的數量,這是錯誤的。應檢查「尺寸」。 – Nowaker

+0

@DamianNowak並非如此,試試irb File.stat('。')。nlink http://www.ruby-doc.org/core-1.9.3/File/Stat.html#method-i-nlink –

+0

我試過,和... http://pastie.org/4128736 – Nowaker

1

不直接,但在* nix類型的系統中完美。

Dir.entries(directory_path) == ['.', '..'] 
0

這是我的這個模板.FYI,我正在尋找源文件內的某種匹配。

mydir = "/home/to/mydir" 

Dir.chdir(mydir) 

if Dir.entries(mydir).select(|x| x != '.' && x != '..' && x =~ /\regex.txt\z/).size > 0 


     do_something 

elsif Dir.entries(mydir).select(|x| x != '.' && x != '..' && x =~ /\regex.txt\z/).size < 0 

     do_something_else 

else 

     puts "some warning message" 
end 

讓我知道如果有什麼:)