2016-06-15 33 views
5

C'è lo script per ricreare cartella:Come evitare "WindowsError: [Errore 5] Accesso negato"

# Remove folder (if exists) with all files 
if os.path.isdir(str(os.path.realpath('..') + "\\my_folder")): 
     shutil.rmtree(os.path.realpath('..') + "\\my_folder", ignore_errors=True) 
# Create new folder 
os.mkdir(os.path.realpath('..') + "\\my_folder") 

Questo funziona quasi sempre, ma in alcuni casi (in fase di creazione) ottengo

WindowsError: [Error 5] Access is denied: 'C:\\Path\\To\\my_folder' 

Cosa potrebbe causare questo errore e come posso evitarlo?

+0

controllare questo: http://stackoverflow.com/questions/12990112/how-to-remove-folder-in-python-rmtree-onerror – Netwave

risposta

1

Succede perché non si sta verificando se si dispone delle autorizzazioni per aprire quel percorso. È necessario modificare le autorizzazioni su tali cartelle.

6

Cosa potrebbe causare questo errore?

Semplicemente non si ha accesso alla cartella in cui si sta scrivendo per il processo attualmente in esecuzione (python.exe) o forse anche per l'utente. A meno che il tuo utente non sia un amministratore, potrebbero esserci delle directory per le quali non hai permessi di scrittura.


Come posso evitarlo?

In generale, per evitare tale eccezione, si potrebbe utilizzare un blocco try e except, in questo caso sarebbe una IOError. Pertanto se si desidera solo a trascurare l'accesso negato e continuare con lo script si può provare:

try: 
    # Remove folder (if exists) with all files 
    if os.path.isdir(str(os.path.realpath('..') + "\\my_folder")): 
     shutil.rmtree(os.path.realpath('..') + "\\my_folder", ignore_errors=True) 
    # Create new folder 
    os.mkdir(os.path.realpath('..') + "\\my_folder") 
except IOError: 
    print("Error upon either deleting or creating the directory or files.") 
else: 
    print("Actions if file access was succesfull") 
finally: 
    print("This will be executed even if an exception of IOError was encountered") 

Se veramente non si aspettavano questo errore e non dovrebbe accadere è necessario cambiare i permessi per il file. A seconda delle autorizzazioni dell'utente ci sono vari passaggi che è possibile eseguire.

  • utente in grado di eseguire programmi come Admin:Opzione A

    1. fare clic destro sul cmd.exe.
    2. Fare clic su Esegui come amministratore.
    3. Vai alla posizione dello script tramite cd poiché verrà aperto a C:\Windows\system32 a meno che tu non abbia modificato determinati parametri.
    4. Esegui lo script > python myscript.py.
  • utente in grado di eseguire programmi come Admin:Opzione B

    1. Aprire file explorer.
    2. Passare alla cartella o alle cartelle in cui si desidera scrivere.
    3. Fare clic con il tasto destro su di esso.
    4. Selezionare Proprietà.
    5. Nella finestra delle proprietà selezionare la scheda di sicurezza.
    6. Fare clic su Modifica e modificarlo come desiderato o necessario per consentire l'accesso a programmi o utenti.
  • utente senza privilegi di amministratore:

    1. Questo probabilmente significa che non è il computer.
    2. Controllare l'help desk del PC in Uni or Work o chiedere al proprio insegnante se a scuola.
    3. Se sei a casa ed è il tuo computer significa che hai effettuato l'accesso con un utente non amministratore. Il primo che crei in genere è di default. Controllare le impostazioni utente nel pannello di controllo in caso affermativo.
    4. Da lì il resto è praticamente lo stesso dopo.
+0

Ho provato tutto su questa risposta ma non ha funzionato, mi sta davvero dando fastidio. –

+0

Sono in esecuzione nello stesso problema e non è sicuramente un problema di autorizzazioni.Se metto qualche secondo di sonno tra rmtree e mkdir funziona sempre, ma se faccio l'mkdir immediatamente fallisce ogni volta. – Emma

+0

Wow questa domanda è vecchia haha ​​la cosa è che il richiedente originale ha cambiato la domanda così tanto, la mia risposta è fondamentalmente solo un bene per una panoramica sui problemi di autorizzazione. La domanda originale era proprio sulla falsariga di non essere in grado di accedere a una cartella senza parlare di eccezioni ma in realtà volevano una risposta se non fossero state lanciate eccezioni, quindi probabilmente hai ragione. – Mixone

4

Permessi potrebbe essere il problema, ma ho avuto lo stesso problema '[Errore 5] Accesso negato' su un os.rename() e un semplice tentativi anello era in grado di rinominare il file dopo un paio di tentativi.

for retry in range(100): 
    try: 
     os.rename(src_name,dest_name) 
     break 
    except: 
     print "rename failed, retrying..." 
5

Vedere la documentazione di RemoveDirectory; "La funzione RemoveDirectory contrassegna una directory per l'eliminazione alla chiusura, pertanto la directory non viene rimossa finché non viene chiuso l'ultimo handle della directory."

Questo significa che se qualcosa riesce a creare un handle per la directory si rimuove (tra creazione e la rimozione), allora la directory non viene effettivamente rimosso e si ottiene il 'Accesso negato',

per risolvere questo rename la directory che si desidera rimuovere prima di rimuoverla.

Così

while True: 
    mkdir('folder 1') 
    rmdir('folder 1') 

può fallire, di risolvere con;

while True: 
    mkdir('folder 1') 
    new_name = str(uuid4()) 
    rename('folder 1', new_name) 
    rmdir(new_name) 
+0

Il problema non è più reale, quindi non posso controllarlo. Ma sono abbastanza sicuro che questo dovrebbe funzionare – Andersson

+0

Posso confermare che questo trucco ha funzionato. È interessante notare che, dopo aver chiamato rmdir, stavo usando os.path.exists() per verificare se la cartella fosse stata cancellata correttamente prima di tentare di ricrearla. Anche se os.path.exists (percorso) restituiva False, ricevevo ancora l'errore "Accesso negato" durante l'esecuzione di os.mkdir (percorso). – Emma

1

Crea il tuo file di script Python. In questo caso è possibile copiarlo in C: \ WINDOWS \ system32. Il file di script sta creando una cartella denominata "Smaog"

import os 
os.chdir('C:/Program Files') 
os.makedirs('Smaog') 

Crea file batch, in qualsiasi cartella che ti piace.

echo off 
title Renaming Folder 
python sample.py 
pause 

Salvare il file batch. Per eseguirlo, fare clic con il pulsante destro del mouse e scegliere Esegui come amministratore

Anche se si può scegliere di farlo, se non si desidera inserire il proprio script python in C: \ WINDOWS \ system32. Nel file batch, indicare la cartella/directory in cui si trova il file di script python.

echo off 
title Renaming Folder 
cd c:\Users\Smaog\Desktop 
python sample.py 
pause 

Quindi eseguirlo come amministratore come spiegato poco sopra.