Como excluir uma pasta em Python quando o [Erro 32] está presente

1

Estou usando o Python 2.7. Eu quero excluir uma pasta que pode ou não estar vazia. A pasta é manipulada por um encadeamento para monitoramento de arquivos. Eu não sou capaz de matar o segmento, mas queria excluir esta pasta de qualquer maneira. Eu tentei com:

os.rmdir(Location)
shutil.rmtree(Location) 
os.unlink(Location)

... mas não funcionou. Está a mostrar este erro:
[Error 32] The process cannot access the file because it is being used by another process: 'c:\users\cipher~1\appdata\local\temp\fis\a0c433973524de528420bbd56f8ede609e6ea700'
Eu quero excluir pasta a0c433973524de528420bbd56f8ede609e6ea700 ou excluir todo o caminho também será suficiente.

class myThread (threading.Thread):
    def __init__(self, threadID, fileName, directory, origin):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.fileName = fileName
        self.daemon = True
        self.dir = directory
        self.originalFile = origin
    def run(self):
        startMonitor(self.fileName, self.dir, self.originalFile)

def startMonitor(fileMonitoring,dirPath,originalFile):
    logging.debug("in startMonitor")
    hDir = win32file.CreateFile (
      dirPath,
      FILE_LIST_DIRECTORY,
      win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE,
      None,
      win32con.OPEN_EXISTING,
      win32con.FILE_FLAG_BACKUP_SEMANTICS,
      None
    )
    logging.debug("Wait for new data and call ProcessNewData for each new chunk that's written")
    readFlags = win32con.FILE_NOTIFY_CHANGE_FILE_NAME  | \
            win32con.FILE_NOTIFY_CHANGE_DIR_NAME   | \
            win32con.FILE_NOTIFY_CHANGE_ATTRIBUTES | \
            win32con.FILE_NOTIFY_CHANGE_SIZE       | \
            win32con.FILE_NOTIFY_CHANGE_LAST_WRITE | \
            win32con.FILE_NOTIFY_CHANGE_SECURITY
    # Wait for new data and call ProcessNewData for each new chunk that's written
    while 1:
        # Wait for a change to occur
        results = win32file.ReadDirectoryChangesW (
                                                   hDir,
                                                   1024,
                                                   False,
                                                   readFlags,
                                                   None
                                                   )
        # For each change, check to see if it's updating the file we're interested in
        logging.debug("For each change, check to see if it's updating the file we're interested in")
        for action, file_M in results:
            full_filename = os.path.join (dirPath, file_M)
            #print file, ACTIONS.get (action, "Unknown")
            if len(full_filename) == len(fileMonitoring) and action == 3:
                #copy to main file
                if os.path.exists(originalFile):
                        encrypt_file(key,fileMonitoring,originalFile,iv)

 try:
        thread1 = myThread(1, FileName, Location,selectedFileName)
        thread1.start();
        startupinfo = None
        if os.name == 'nt':
            startupinfo = subprocess.STARTUPINFO()
            startupinfo.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW
            logging.debug("control to file open subprocess")
            ss=subprocess.Popen(FileName,shell=True)
            ss.communicate()


            logging.debug("file open subprocess executed")
            removeTempFile(FileName)
            logging.debug("file removed")
            shutil.rmtree(Location) #to remove folder, I asked question for this ony.
            sys.exit(0)
    except Exception as e:
        print e
        logging.error(e)
        logging.debug("exception in encryption Thread")
        removeTempFile(FileName)
        sys.exit(e)
    
por sherlock 05.11.2013 / 10:39

1 resposta

2

O Windows usa o bloqueio . Você não pode excluir um arquivo ou pasta que está em uso por outro processo. Alguns tipos de bloqueios também afetam outros segmentos no mesmo processo. Eu temo que você tenha que terminar o tópico de monitoramento ou desviá-lo para outro diretório antes de poder excluir este diretório.

    
por 05.11.2013 / 21:10