Come eliminare una cartella in Python quando è presente [Errore 32]


1

Sto usando Python 2.7. Voglio cancellare una cartella che può o non può essere vuota. La cartella è gestita da un thread per il monitoraggio dei file. Non sono in grado di uccidere il thread, ma ho voluto comunque eliminare questa cartella. Ho provato con:

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

... ma non ha funzionato. Sta mostrando questo errore:
[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'
Voglio cancellare la cartella a0c433973524de528420bbd56f8ede609e6ea700 o cancellare l'intero percorso sarà anche sufficiente.

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)

Risposte:


2

Windows utilizza bloccaggio . Non è possibile eliminare un file o una cartella che è in uso da un altro processo. Alcuni tipi di blocchi influenzano anche altri thread all'interno dello stesso processo. Temo che dovrai terminare il thread di monitoraggio o deviarlo su un'altra directory prima di poter cancellare questa directory.


Si prega di consultare il codice
sherlock
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.