J'essaye de créer un répertoire avec le code suivant:
Dir.mkdir("/Users/Luigi/Desktop/Survey_Final/Archived/Survey/test")
unless File.exists?("/Users/Luigi/Desktop/Survey_Final/Archived/Survey/test")
Cependant, je reçois cette erreur:
Aucun fichier ou répertoire de ce type - / Users / Luigi / Desktop / Survey_Final / Archived / Survey / test (Errno :: ENOENT)
Pourquoi ce répertoire n'est-il pas créé par l' Dir.mkdir
instruction ci-dessus?
File.exists?()
fonctionne sur les fichiers et les dossiers. Il ne connaît pas la différence.Réponses:
Vous essayez probablement de créer des répertoires imbriqués. En supposant qu'il
foo
n'existe pas, vous recevrez uneno such file or directory
erreur pour:Pour créer des répertoires imbriqués à la fois, il
FileUtils
est nécessaire:Edit2: vous n'avez pas à utiliser
FileUtils
, vous pouvez faire un appel système (la mise à jour de @mu est un commentaire trop court):Mais cela semble (du moins pour moi) une approche aussi pire que vous utilisez un «outil» externe qui peut être indisponible sur certains systèmes (bien que je puisse difficilement imaginer un système sans
mkdir
, mais qui sait).la source
system 'mkdir', '-p', 'foo/bar'
serait une meilleure version de cetsystem
appel. Il n'y a pas besoin d'un processus shell supplémentaire ou du non-sens habituel des guillemets / échappements / injection qui accompagne la version à argument unique desystem
.system
se lancera/bin/sh
pour analyser lamkdir -p "foo/bar"
chaîne, puis le shell s'exécutera/bin/mkdir
. Vous faites donc un travail supplémentaire (créez la chaîne de commande, lancez-la/bin/sh
pour la séparer à nouveau) et une partie de ce travail supplémentaire vous laisse ouvert aux attaques par injection de shell (passez un peu de temps dans les avis CERT pour Ruby et vous verrez à quel point ce problème est).system
appel est-il meilleur que defileutils
nouveau? Je suis sous Windows etmkdir_p
fonctionne très bien sans engendrer un sous-shell juste pour analysermkdir -p
ce qui échouerait de toute façon. Heureux que cefileutils
soit la première alternative dans la réponse.fileutils
oumkdir_p
, tout ce que je dis, c'est quesystem command, arg1, arg2, ...
c'est mieux quesystem command_with_arguments
.Manière simple:
la source
Un autre moyen simple:
Dir.mkdir('tmp/excel') unless Dir.exist?('tmp/excel')
la source
/home/jignesh/reports/test
mais en utilisant cette solution soulevéeRUBY (Errno::ENOENT), no such file or directory @ dir_s_mkdir
. Donc, la solution fiable utiliseFileUtils.mkdir_p
Que diriez-vous juste
Dir.mkdir('dir') rescue nil
?la source
rescue
sous sa forme de modificateur.