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é. enter image description here

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?
35
demandé sur prosseek 2011-01-28 17:02:39

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 ().

47
répondu Mark 2014-07-07 18:53:50

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)
9
répondu YOU 2011-01-28 14:07:59

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.

5
répondu Mike Gleen 2011-11-30 09:18:43

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' rmtreeonerror 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.

4
répondu Tomasz Gandor 2014-01-17 21:54:36
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/

3
répondu zoumi 2013-02-19 12:47:40