Estoy tratando de crear un directorio con el siguiente código:
Dir.mkdir("/Users/Luigi/Desktop/Survey_Final/Archived/Survey/test")
unless File.exists?("/Users/Luigi/Desktop/Survey_Final/Archived/Survey/test")
Sin embargo, estoy recibiendo este error:
No existe tal archivo o directorio - / Users / Luigi / Desktop / Survey_Final / Archived / Survey / test (Errno :: ENOENT)
¿Por qué este directorio no está siendo creado por la Dir.mkdir
declaración anterior?
File.exists?()
Funciona en archivos y carpetas. No sabe la diferencia.Respuestas:
Probablemente esté intentando crear directorios anidados. Suponiendo
foo
que no existe, recibirá unno such file or directory
error por:Para crear directorios anidados a la vez,
FileUtils
es necesario:Edit2: no tiene que usar
FileUtils
, puede hacer una llamada al sistema (la actualización de @mu es un comentario demasiado corto):Pero eso parece (al menos para mí) un enfoque peor que el que está utilizando una 'herramienta' externa que puede no estar disponible en algunos sistemas (aunque difícilmente puedo imaginar un sistema sin ellos
mkdir
, pero quién sabe).fuente
system 'mkdir', '-p', 'foo/bar'
sería una mejor versión de esasystem
llamada. No hay necesidad de un proceso de shell adicional o las tonterías habituales de cita / escape / inyección que vienen con la versión de argumento único desystem
.system
se iniciará/bin/sh
para analizar lamkdir -p "foo/bar"
cadena y luego se ejecutará el shell/bin/mkdir
. Entonces, está haciendo un trabajo adicional (cree la cadena de comando, inicie/bin/sh
para separarlo nuevamente) y parte de ese trabajo adicional lo deja abierto a ataques de inyección de shell (pase un tiempo en los avisos del CERT para Ruby y verá qué tan común este problema es)system
llamada mejor quefileutils
otra vez? Estoy en Windows ymkdir_p
funciona bien sin generar una subshell solo para analizar,mkdir -p
lo que fallaría de todos modos. Me alegro de que esafileutils
sea la primera alternativa en la respuesta.fileutils
omkdir_p
, todo lo que digo es quesystem command, arg1, arg2, ...
es mejor quesystem command_with_arguments
.Manera simple:
fuente
Otra forma simple:
Dir.mkdir('tmp/excel') unless Dir.exist?('tmp/excel')
fuente
/home/jignesh/reports/test
pero utilizando esta solución planteadaRUBY (Errno::ENOENT), no such file or directory @ dir_s_mkdir
. Entonces, la solución confiable está usandoFileUtils.mkdir_p
¿Qué tal solo
Dir.mkdir('dir') rescue nil
?fuente
rescue
en su forma modificadora.