2010-06-11 2 views
3

Я пытаюсь удалить старые SVN-файлы из дерева каталогов. shutil.rmtree и os.unlink raise WindowsError s, потому что у скрипта нет разрешений для их удаления. Как я могу обойти это?Python скрипт для удаления старых файлов SVN не имеет разрешения

Вот сценарий:

# Delete all files of a certain type from a direcotry 

import os 
import shutil 

dir = "c:\\" 

verbosity = 0; 

def printCleanMsg(dir_path): 
    if verbosity: 
     print "Cleaning %s\n" % dir_path 

def cleandir(dir_path): 
    printCleanMsg(dir_path) 
    toDelete = [] 
    dirwalk = os.walk(dir_path) 
    for root, dirs, files in dirwalk: 
     printCleanMsg(root) 
     toDelete.extend([root + os.sep + dir for dir in dirs if '.svn' == dir]) 
     toDelete.extend([root + os.sep + file for file in files if 'svn' in file]) 

    print "Items to be deleted:" 
    for candidate in toDelete: 
     print candidate 
    print "Delete all %d items? [y|n]" % len(toDelete) 

    choice = raw_input() 

    if choice == 'y': 
     deleted = 0 
     for filedir in toDelete: 
      if os.path.exists(filedir): # could have been deleted already by rmtree 
       try: 
        if os.path.isdir(filedir): 
         shutil.rmtree(filedir) 
        else: 
         os.unlink(filedir) 
        deleted += 1 
       except WindowsError: 
        print "WindowsError: Couldn't delete '%s'" % filedir 

    print "\nDeleted %d/%d files." % (deleted, len(toDelete)) 
    exit() 

if __name__ == "__main__": 
    cleandir(dir) 

Ни один файл может быть удален. Что я делаю не так?

+0

Просто для того, чтобы покрыть очевидное: вы уверены, что это проблема разрешения? –

+0

Да. В нем говорится: 'WindowsError: [Ошибка 5] Доступ запрещен: 'dir'' –

ответ

4

Subversion обычно делает все каталоги .svn (и все в них) защищенное от записи. Возможно, вам нужно удалить защиту для записи, прежде чем вы сможете удалить файлы.

Я не уверен, как это сделать лучше всего с Windows, но вы должны иметь возможность использовать os.chmod() с флагом stat.S_IWRITE. Вероятно, вам нужно перебирать все файлы в каталогах .svn и сделать их доступными для записи отдельно.

0

Чтобы удалить рекурсивно все .svn, я использую этот скрипт. Может быть, это поможет кому-то.

import os, shutil, stat 

def del_evenReadonly(action, name, exc): 
    os.chmod(name, stat.S_IWRITE) 
    os.remove(name) 

for root, subFolders, files in os.walk(os.getcwd()): 
    if '.svn' in subFolders: 
     shutil.rmtree(root+'\.svn',onerror=del_evenReadonly) 
Смежные вопросы