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?

Cinza
fonte

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.

Emily
fonte
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

ma11hew28
fonte
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
Andrew
fonte
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.

cloudhead
fonte
7

Você poderia usar Kernel#test:

test ?d, 'some directory'

obtém suas origens em https://ss64.com/bash/test.html, você notará que o bash testtem esse sinalizador -dpara testar se existe um diretório -d file True if file is a Directory. [[ -d demofile ]]

jtzero
fonte
1
Isso é legal. Não é o mais imediatamente expressivo , mas puro.
kayleeFrye_onDeck