2012-09-09 21 views
30

Ruby'de boş olmayan bir dizini silmeye çalışıyorum ve bunun için hangi yoldan gidersek gidelim işe yaramıyor. Ben fileutils, sistem çağrıları, yinelemeli verilen dizine gidip herşeyi silme, ama her zaman ile bitirmek gibi görünüyor (geçici?) Dosyaları kullanılarak denedi böyleRuby silme dizinleri

.__ afsECFC
.__ afs73B9

olarak

Bunun neden olduğunu ve bunun etrafında nasıl gidebileceğimi bilen var mı?

+0

Eğer aradığınız hangi yöntemi nasıl bize gösterir misin ve ne kadar çağırıyor musun? Sormamın sebebi, @ismaelga'nın cevabı benim için de iyi. –

+0

0ismumlga önerildiği gibi 'FileUtils.rm_rf ('directorypath/name')' , yanı sıra 'rm -rf @ {path}' ' kullanmayı denedim ancak dosyalarımı doğru şekilde kapatmıyordum. – Ced

cevap

9

Hatanı fark ettim, bazı dosyalar kapatılmamıştı. Daha önce benim programda ben

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

için takas

File.open(filename).read 

Ve şimdi

FileUtils.rm_rf(dirname) 

eserleri kusursuz

+5

olmadan silebiliyorum. Tam dosyayı okuyorsanız, 'File.read dosya adı '(en azından MRG'de, JRuby veya Rubinius'un bunu desteklemediğini sanmıyorum) ve bunu gösterme şeklinizle yapmak istiyorsanız, blok formunu kullanmak daha iyidir çünkü dosya kapanmasını sağlar: 'File.open (dosya adı," r ") {| dosya | ...} 'veya' File.foreach (dosya adı) {| line | ...} ' –

80
require 'fileutils' 

FileUtils.rm_rf('directorypath/name') 

Bu işe yaramıyor mu?

+0

Hayır, bu dosyaları oluştururlar ve bu dosyaları oluşturur ve – Ced

+0

dizinini silmez, bunları silmek için izniniz yok mu? –

+0

Aynı programda oluşturuldukları için bunları değiştirebilme iznim olduğundan eminim ve tek dosyayi – Ced

26

Güvenli yöntem kullanıyordu: FileUtils.remove_dir(somedir)

+3

Doğru cevap budur – Sam

4

Ben kullanan basit bir özyinelemeli yöntemi "bir ek lib kullanmadan" tüm içeriği ile bir dizin kaldırmak için en iyi yolu tahmin:

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)