2012-09-09 24 views
30

Estoy tratando de eliminar un directorio no vacío en Ruby y no importa en qué camino lo haga, se niega a funcionar. He intentado usar FileUtils, llamadas al sistema, de forma recursiva de entrar en el directorio dado y eliminación de todo, pero siempre parecen terminar con (temporal?) Archivos tales comoRuby borrar directorios

.__ afsECFC
.__ afs73B9

¿Alguien sabe por qué sucede esto y cómo puedo evitarlo?

+0

¿Nos cómo el método que está llamando mostrar y cómo eres llamándolo? La razón por la que pregunto es porque la respuesta de @ismaelga también funciona bien para mí. –

+0

He intentado usar 'FileUtils.rm_rf ('directorypath/name')' como @ismealga sugerido, así como '' rm -rf @ {path} '' pero como no estaba cerrando correctamente mis archivos, estaban creando esos temporales – Ced

Respuesta

9

Realicé mi error, algunos de los archivos no se habían cerrado. que antes en mi programa que estaba usando

File.open(filename).read 

que he cambiado por un

f = File.open(filename, "r") 
while line = f.gets 
    puts line 
end 
f.close 

Y ahora

FileUtils.rm_rf(dirname) 

funciona a la perfección

+5

Si solo está leyendo el archivo completo, puede hacer 'File.read nombre de archivo '(al menos en MRI, no creo que JRuby o Rubinius apoyen esto todavía), y si quieres hacerlo de la manera en que lo estás mostrando, es mejor usar el formulario de bloque porque asegura que el archivo se cierre: 'File.open (nombre de archivo," r ") {| archivo | ...} 'o' File.foreach (nombre de archivo) {| línea | ...} ' –

80
require 'fileutils' 

FileUtils.rm_rf('directorypath/name') 

¿Esto no funciona?

+0

No, crea esos archivos, y no elimina el directorio – Ced

+0

¿puede ser porque no tiene permisos para eliminarlos? –

+0

Estoy bastante seguro de que tengo permiso para cambiarlos, ya que se están creando en el mismo programa, y ​​puedo eliminar archivos individuales sin problema – Ced

26

método seguro: FileUtils.remove_dir(somedir)

+3

Esta es la respuesta correcta – Sam

4

Creo que la mejor manera de eliminar un directorio con todo su contenido "sin utilizar un lib Adicional" está usando un simple método recursivo:

def remove_dir(path) 
    if File.directory?(path) 
    Dir.foreach(path) do |file| 
     if ((file.to_s != ".") and (file.to_s != "..")) 
     remove_dir("#{path}/#{file}") 
     end 
    end 
    Dir.delete(path) 
    else 
    File.delete(path) 
    end 
end 
remove_dir(path) 
Cuestiones relacionadas