Comment supprimer le répertoire atrib en lecture seule avec Python dans Windows?
j'ai un répertoire en lecture seule copié à partir du répertoire contrôlé par la version qui est verrouillé.
Quand j'ai essayé de supprimer ce répertoire shutil.rmtree(TEST_OBJECTS_DIR)
commande, j'ai eu le message d'erreur suivant.
WindowsError: [Error 5] Access is denied: 'C:...environment.txt'
- Q: Comment changer l'attribut de tout dans un entier structure du répertoire?
5 réponses
Si vous utilisez shutil.rmtree, vous pouvez utiliser le membre onerror de cette fonction pour fournir une fonction qui prend trois paramètres: fonction, chemin, et information d'exception. Vous pouvez utiliser cette méthode pour marquer que les fichiers en lecture seule sont accessibles en écriture pendant que vous supprimez votre arborescence.
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 )
Maintenant, pour être juste, la fonction d'erreur pourrait être appelé pour une variété de raisons. Le paramètre 'func' peut vous indiquer quelle fonction "failed" (os.rmdir () ou os.supprimer.))( Ce que vous faites ici dépend de comment une preuve que tu veux que ta rmtree le soit. Si c'est vraiment juste un cas d'avoir besoin de marquer des fichiers comme writable, vous pourriez faire ce que j'ai fait ci-dessus. Si vous voulez être plus prudent (c'est-à-dire déterminer si le répertoire ne peut pas être supprimé, ou s'il y a une violation de partage sur le fichier en essayant de le supprimer), la logique appropriée devrait être insérée dans la fonction on_rm_error ().
pas testé mais il le serait, quelque chose comme activer l'accès en écriture.
import os, stat
os.chmod(ur"file_path_name", stat.S_IWRITE)
vous pouvez avoir besoin de combiner avec os.marcher pour que tout écrire soit activé. quelque chose comme
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)
La méthode que j'ai utilisée, c'est de faire:
if os.path.exists(target) :
subprocess.check_call(('attrib -R ' + target + '\* /S').split())
shutil.rmtree(target)
avant que quelqu'un saute sur moi, je sais que c'est terriblement Non-pythonique, mais c'est peut-être plus simple que les réponses plus traditionnelles données ci-dessus, et a été fiable.
Je ne suis pas sûr de ce qui se passe en ce qui concerne les attributs de lecture/écriture sur les répertoires. Mais ça n'a pas encore été un problème.
la réponse acceptée est presque correcte, mais elle pourrait échouer dans le cas d'un sous-répertoire en lecture seule.
La fonction est donnée comme argument à l' rmtree
onerror
gestionnaire.
je dirais:
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)
dans le cas où la fonction échoue à nouveau, vous pouvez voir la raison, et continuer à supprimer.
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)
copie from:http://code.activestate.com/recipes/303343-changing-file-attributes-on-windows/