2016-12-05 2 views
1

Au moins sous Windows, shutil.move un dossier contenant des fichiers en lecture seule sur un autre lecteur échouera. Il échoue car move est implémenté avec un copy suivi d'un rmtree. À la fin, c'est le rmtree essayant de supprimer des fichiers non-inscriptibles.comment `shutil.move` avec des fichiers readonly sur les lecteurs

Actuellement, je travaille autour d'abord le réglage de la stat.S_IWUSER pour tous (imbriqués) fichiers, mais maintenant je rétablisse toujours le stat d'origine après:

def make_tree_writable(source_dir): 
    for root, dirs, files in os.walk(source_dir): 
     for name in files: 
      make_writable(path.join(root, name))  

def make_writable(path_): 
    os.chmod(path_, stat.S_IWUSR) 

def movetree_workaround(source_dir, target_dir): 
    make_tree_writable(source_dir) 
    shutil.move(source_dir, target_dir) 

Alors je me demande: est-ce ainsi? Y a-t-il un shutil2 en cours de réalisation que je pourrais utiliser? Puis-je avoir de l'aide là-bas?

+2

Pourquoi ne pas d'abord 'shutil.copytree()', puis changer les permissions de la source et enfin 'shutil.rmtree' sur la source? – VBB

+3

Pourquoi ne pas verser cela dans une réponse pour que je puisse l'incriminer? – xtofl

+0

Lié (non dupliqué): [shutil.rmtree pour supprimer les fichiers en lecture seule] (http://stackoverflow.com/q/21261132/364696) – ShadowRanger

Répondre

2

Vous pouvez le faire en deux étapes: d'abord, utilisez shutil.copytree() pour copier le répertoire complet et la structure de fichiers avec les autorisations appropriées. Ensuite, vous pouvez modifier les autorisations de la source pour vous assurer que vous avez le droit de supprimer des éléments et utiliser shutil.rmtree() pour supprimer l'ancienne source.