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.mkdirdeclaración anterior?

File.exists?()Funciona en archivos y carpetas. No sabe la diferencia.Respuestas:
Probablemente esté intentando crear directorios anidados. Suponiendo
fooque no existe, recibirá unno such file or directoryerror por:Para crear directorios anidados a la vez,
FileUtilses 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 esasystemllamada. 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.systemse iniciará/bin/shpara 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/shpara 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)systemllamada mejor quefileutilsotra vez? Estoy en Windows ymkdir_pfunciona bien sin generar una subshell solo para analizar,mkdir -plo que fallaría de todos modos. Me alegro de que esafileutilssea la primera alternativa en la respuesta.fileutilsomkdir_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/testpero 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
rescueen su forma modificadora.