Como verificar se um determinado diretório existe no Ruby


163

Estou tentando escrever um script que faça check-out automático ou atualize uma URL do Subversion com base na existência ou não de um diretório especificado.

Por alguma razão, meu código não está funcionando e sempre retorna verdadeiro, mesmo que seja falso:

def directory_exists?(directory)
  return false if Dir[directory] == nil
  true
end

O que estou fazendo de errado?

Respostas:


287

Se importa se o arquivo que você está procurando é um diretório e não apenas um arquivo, você pode usar File.directory?ou Dir.exist?. Isso retornará true somente se o arquivo existir e for um diretório.

Como um aparte, uma maneira mais idiomática de escrever o método seria aproveitar o fato de que Ruby retorna automaticamente o resultado da última expressão dentro do método. Assim, você poderia escrever assim:

def directory_exists?(directory)
  File.directory?(directory)
end

Observe que o uso de um método não é necessário no presente caso.


139
Por que se incomodar em colocá-lo em outro método? Basta ligar diretamente!
22799 Ryan Bigg

11
O @Radar percebi que o método simplificado provavelmente foi simplificado para os propósitos da pergunta e que o método real pode conter alguma lógica adicional. Se nenhuma outra lógica precisar seguir o método, eu concordo. Por todos os meios, basta executar o diretório? diretamente.
217 Emily Emily

4
Não seria Dir.exists?não ser mais limpo do que File.directory??
precisa

3
Dir.exists?é obsoleto, o usoDir.exist
fkoessler

4
@burningpony meu mau, éDir.exist?
fkoessler

42

Você também pode usar Dir::exist?assim:

Dir.exist?('Directory Name')

Retorna truese o 'Nome do diretório' for um diretório, falsecaso contrário. 1


2
Isso parece exigir Ruby> 1,9 ou mais; em 1,8, ele retorna undefined method `exists?' for Dir:Class (NoMethodError). Além disso, a forma plural agora está obsoleta, use em .exist?vez disso.
Josip Rodin

40

Todas as outras respostas estão corretas, no entanto, você pode ter problemas se estiver tentando verificar o diretório no diretório inicial de um usuário. Certifique-se de expandir o caminho relativo antes de verificar:

File.exists? '~/exists'
=> false
File.directory? '~/exists'
=> false
File.exists? File.expand_path('~/exists')
=> true

18
File.exist?("directory")

Dir[]retorna uma matriz, portanto nunca será nil. Se você quiser fazer do seu jeito, você pode fazer

Dir["directory"].empty?

que retornará truese não foi encontrado.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.