Ich versuche ein Verzeichnis mit dem folgenden Code zu erstellen:
Dir.mkdir("/Users/Luigi/Desktop/Survey_Final/Archived/Survey/test")
unless File.exists?("/Users/Luigi/Desktop/Survey_Final/Archived/Survey/test")
Ich erhalte jedoch diesen Fehler:
Keine solche Datei oder kein solches Verzeichnis - / Users / Luigi / Desktop / Survey_Final / Archived / Survey / test (Errno :: ENOENT)
Warum wird dieses Verzeichnis nicht durch die Dir.mkdir
obige Anweisung erstellt?
File.exists?()
funktioniert mit Dateien und Ordnern. Es kennt den Unterschied nicht.Antworten:
Sie versuchen wahrscheinlich, verschachtelte Verzeichnisse zu erstellen. Vorausgesetzt,
foo
es existiert nicht, erhalten Sie eineno such file or directory
Fehlermeldung für:Um verschachtelte Verzeichnisse gleichzeitig zu erstellen,
FileUtils
ist Folgendes erforderlich:Edit2: Sie müssen nicht verwenden
FileUtils
, Sie können Systemaufruf ausführen (Update von @mu ist zu kurzer Kommentar):Aber das scheint (zumindest für mich) ein ebenso schlechterer Ansatz zu sein, als wenn Sie ein externes 'Tool' verwenden, das auf einigen Systemen möglicherweise nicht verfügbar ist (obwohl ich mir ein System ohne kaum vorstellen kann
mkdir
, aber wer weiß).quelle
system 'mkdir', '-p', 'foo/bar'
wäre eine bessere Version diesessystem
Aufrufs. Es ist kein zusätzlicher Shell-Prozess oder der übliche Quoting / Escape / Injection-Unsinn erforderlich, der mit der Single-Argument-Version von geliefert wirdsystem
.system
wird gestartet/bin/sh
, um diemkdir -p "foo/bar"
Zeichenfolge zu analysieren, und dann wird die Shell ausgeführt/bin/mkdir
. Sie erledigen also zusätzliche Arbeit (erstellen Sie die Befehlszeichenfolge, starten Sie/bin/sh
, um sie wieder auseinander zu ziehen), und einige dieser zusätzlichen Arbeiten lassen Sie für Shell-Injection-Angriffe offen (verbringen Sie einige Zeit in den CERT-Hinweisen für Ruby, und Sie werden sehen, wie häufig Dieses Problem ist).system
Anruf besser alsfileutils
wieder? Ich bin unter Windows undmkdir_p
funktioniert einwandfrei, ohne eine Subshell zu erzeugen, nur um zu analysieren,mkdir -p
was sowieso fehlschlagen würde. Ich bin froh, dass diesfileutils
die erste Alternative in der Antwort ist.fileutils
odermkdir_p
, alles was ich sage ist, dasssystem command, arg1, arg2, ...
es besser ist alssystem command_with_arguments
.Einfacher Weg:
quelle
Ein anderer einfacher Weg:
Dir.mkdir('tmp/excel') unless Dir.exist?('tmp/excel')
quelle
/home/jignesh/reports/test
aber mit dieser Lösung ausgelöstRUBY (Errno::ENOENT), no such file or directory @ dir_s_mkdir
. Die zuverlässige Lösung ist alsoFileUtils.mkdir_p
Wie wäre es einfach
Dir.mkdir('dir') rescue nil
?quelle
rescue
in der Modifikatorform.