Estou tentando criar um diretório com o seguinte código:
Dir.mkdir("/Users/Luigi/Desktop/Survey_Final/Archived/Survey/test")
unless File.exists?("/Users/Luigi/Desktop/Survey_Final/Archived/Survey/test")
No entanto, estou recebendo este erro:
Esse arquivo ou diretório não existe - / Usuários / Luigi / Desktop / Survey_Final / Arquivado / Pesquisa / teste (Errno :: ENOENT)
Por que esse diretório não está sendo criado pela Dir.mkdir
declaração acima?
File.exists?()
funciona em arquivos e pastas. Não sabe a diferença.Respostas:
Você provavelmente está tentando criar diretórios aninhados. Supondo
foo
que não exista, você receberá umno such file or directory
erro para:Para criar diretórios aninhados de uma só vez,
FileUtils
é necessário:Edit2: você não precisa usar
FileUtils
, pode fazer uma chamada do sistema (a atualização do @mu é um comentário muito curto):Mas isso parece (pelo menos para mim) uma abordagem pior do que você está usando uma 'ferramenta' externa que pode não estar disponível em alguns sistemas (embora eu mal possa imaginar o sistema sem
mkdir
, mas quem sabe).fonte
system 'mkdir', '-p', 'foo/bar'
seria uma versão melhor dessasystem
ligação. Não há necessidade de um processo extra de shell ou do absurdo comum de citação / escape / injeção que vem com a versão de argumento únicosystem
.system
será iniciado/bin/sh
para analisar amkdir -p "foo/bar"
string e, em seguida, o shell será executado/bin/mkdir
. Então você está fazendo um trabalho extra (crie a cadeia de comando, inicie/bin/sh
para separá-la novamente) e parte desse trabalho extra o deixará aberto a ataques de injeção de shell (passe algum tempo nos avisos do CERT para Ruby e verá como é comum esse problema é).system
melhor ligar defileutils
novo? Estou no Windows emkdir_p
funciona muito bem sem gerar um subshell apenas para analisar omkdir -p
que falharia de qualquer maneira. Ainda bem quefileutils
é a primeira alternativa na resposta.fileutils
oumkdir_p
tudo o que estou dizendo é quesystem command, arg1, arg2, ...
é melhor do que issosystem command_with_arguments
.Maneira simples:
fonte
Outra maneira simples:
Dir.mkdir('tmp/excel') unless Dir.exist?('tmp/excel')
fonte
/home/jignesh/reports/test
mas usando esta solução levantadaRUBY (Errno::ENOENT), no such file or directory @ dir_s_mkdir
. Portanto, a solução confiável está usandoFileUtils.mkdir_p
Que tal apenas
Dir.mkdir('dir') rescue nil
?fonte
rescue
em sua forma modificadora.