Come creare directory in modo ricorsivo in ruby?


101

Voglio memorizzare un file come /a/b/c/d.txt, ma non so se esiste una di queste directory e devo crearle ricorsivamente, se necessario. Come si può fare questo in rubino?

Risposte:


197

Usa mkdir_p:

FileUtils.mkdir_p '/a/b/c'

Il _pè un residuato unix per il genitore / percorso è anche possibile utilizzare l'alias mkpathse questo ha più senso per voi.

FileUtils.mkpath '/a/b/c'

In Ruby 1.9 FileUtils è stato rimosso dal core, quindi dovrai farlo require 'fileutils'.


9
+1. FileUtilse Pathnamesono probabilmente gli strumenti più importanti per lo scripting della shell Ruby.
Jörg W Mittag

21

Usa mkdir_p per creare directory in modo ricorsivo

path = "/tmp/a/b/c"

FileUtils.mkdir_p(path) unless File.exists?(path)

5

Se stai girando su macchine unixy, non dimenticare che puoi sempre eseguire un comando di shell sotto ruby ​​inserendolo in backtick.

`mkdir -p /a/b/c`

Essere così positivi è però.
Matthew Schinckel

1
Inserire il comando di sistema nel sottoprocesso non è l'idea migliore. È meglio farlo con la libreria standard Ruby per ottenere la gestione degli errori, controllare il risultato, ecc.
noraj


2

Pathname in soccorso!

Pathname('/a/b/c/d.txt').dirname.mkpath

Questo è meno intuitivo della risposta accettata. Anche il documento per il metodo inoltra a FileUtils ruby-doc.org/stdlib-2.6.5/libdoc/pathname/rdoc/…
noraj

La domanda è: "Voglio memorizzare un file come /a/b/c/d.txt, ma non so se esiste una di queste directory". La mia soluzione consente di utilizzare il percorso del file esistente ('/a/b/c/d.txt') e, senza un'analisi separata, creare tutte le cartelle.
Vadym Tyemirov

Vuoi dire che questo permette di fare FileUtils.mkdir_p '/a/b/c'+ creare d.txtallo stesso tempo?
noraj

No, invece consente Pathname('/a/b/c/d.txt').dirname.mkpathe File.write('/a/b/c/d.txt', content)senza filename = '/a/b/c/d.txt'.rpartition('/').laste il resto dell'analisi
Vadym Tyemirov

0

Potresti anche usare la tua logica

def self.create_dir_if_not_exists(path)
  recursive = path.split('/')
  directory = ''
  recursive.each do |sub_directory|
    directory += sub_directory + '/'
    Dir.mkdir(directory) unless (File.directory? directory)
  end
end

Quindi se il percorso è "tmp / a / b / c" se "tmp" non esiste, viene creato "tmp", allora "tmp / a /" e così via.


Si eviterebbe di reinventare la ruota.
noraj
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.