2011-01-28 11 views
29

Ben kilitli sürüm kontrollü dizinden kopyalanan salt okunur bir dizin var. enter image description herenasıl salt okunur Python ile attrib dizini Windows kaldırmak için?

Ben shutil.rmtree(TEST_OBJECTS_DIR) komutuyla bu dizini kaldırmak için çalıştı , aşağıdaki hata iletisi aldık.

WindowsError: [Error 5] Access is denied: 'C:\...\environment.txt' 
  • S: Nasıl bir bütün dizin yapısında her şeyin niteliğini değiştirebilir?

cevap

38

gibi bir şey sen shutil.rmtree kullanıyorsanız, üç params alır bir işlevi sağlamak için bu fonksiyonun onerror üyesini kullanabilirsiniz. Ağzınızı silerken yalnızca okunabilir dosyaları okunabilir olarak işaretlemek için bu yöntemi kullanabilirsiniz.

import os, shutil, stat 

def on_rm_error(func, path, exc_info): 
    # path contains the path of the file that couldn't be removed 
    # let's just assume that it's read-only and unlink it. 
    os.chmod(path, stat.S_IWRITE) 
    os.unlink(path) 

shutil.rmtree(TEST_OBJECTS_DIR, onerror = on_rm_error) 

Şimdi, adil olmak gerekirse, hata işlevi çeşitli nedenlerden dolayı çağrılabilir. 'Func' parametresi hangi fonksiyonun "başarısız" olduğunu söyler (os.rmdir() veya os.remove()). Burada yaptığınız şey, rmtree'nizin olmasını istediğiniz kurşun geçirmezliğe bağlıdır. Dosyaların yazılabilir olarak işaretlenmesine ihtiyaç duyuyorsa, yukarıda yaptığım şeyi yapabilirsiniz. siz) (uygun mantık on_rm_error eklenecek gerekir (yani dizin kaldırılmış coudln't olmadığının belirlenmesi veya kaydedilen bir paylaşım ihlali varsa bunu silinmeye çalışılırken) daha dikkatli olmak işlevini istiyorsanız . Ben kullandım

+1

Serin! Bu daha özel bir yaklaşım. – YOU

9

, yazma erişimi sağlamak için böyle bir şey test ama bu olurdu değil.

import os, stat 

os.chmod(ur"file_path_name", stat.S_IWRITE) 

Her şeyin yazılmasını sağlamak için os.walk ile birleştirmeniz gerekebilir. fonksiyonu, yolunu, ve istisna bilgi:

for root, dirs, files in os.walk(ur'root_dir'): 
    for fname in files: 
     full_path = os.path.join(root, fname) 
     os.chmod(full_path ,stat.S_IWRITE) 
+0

Daha fazla detay, çok: http://techarttiki.blogspot.com/2008/08/read-only-windows-files-with-python.html – payne

4

yöntem yapmaktır: Ben bu korkunç un-pythonic olduğunu biliyoruz,

if os.path.exists(target) : 
    subprocess.check_call(('attrib -R ' + target + '\\* /S').split()) 
    shutil.rmtree(target) 

kimse bana atlar önce, ancak yukarıda verilen daha geleneksel yanıtlardan daha muhtemelen basittir, ve güvenilir olmuştur.

Ben okuma/yazma konusunda dizinlerde niteliklerini ne olur emin değilim. Ama henüz bir sorun olmadı.

+0

Bu çözüm, pencereler üzerinde çalışır (attrib.exe mevcut olduğu sürece) ve harici python modülleri gerektirmez. – Nils

+0

çözüm harika ve daha verimli buluyorum – Kewin

+0

@Nils Şimdiye kadar sunulan diğer çözümlerin hiçbiri, herhangi bir harici Python modülü gerektirmiyor. DÜZENLEME: Tamam, win32con malzemelerini özledim. – antred

2
import win32con, win32api,os 

file='test.txt' 

#make the file hidden 
win32api.SetFileAttributes(file,win32con.FILE_ATTRIBUTE_HIDDEN) 

#make the file read only 
win32api.SetFileAttributes(file,win32con.FILE_ATTRIBUTE_READONLY) 

#to force deletion of a file set it to normal 
win32api.SetFileAttributes(file, win32con.FILE_ATTRIBUTE_NORMAL) 
os.remove(file) 

kopya dan: http://code.activestate.com/recipes/303343-changing-file-attributes-on-windows/

4

kabul cevap neredeyse haklı, ama salt okunur alt dizinin durumda başarısız olabilir. Bu işlev, rmtree ürününün onerror işleyicisine bir argüman olarak verilmiştir.

öneririm: durumunda işlev yine başarısız

import os, shutil, stat 

def remove_readonly(fn, path, excinfo): 
    try: 
     os.chmod(path, stat.S_IWRITE) 
     fn(path) 
    except Exception as exc: 
     print "Skipped:", path, "because:\n", exc 

shutil.rmtree(TEST_OBJECTS_DIR, onerror=remove_readonly) 

, sen neden görmüyorum ve silme devam edebilirsiniz. Burada

İlgili konular