Perché viene negato l'accesso al percorso?


156

Sto riscontrando un problema in cui sto provando a eliminare il mio file ma ottengo un'eccezione.

if (result == "Success")
{
     if (FileUpload.HasFile)
     {
         try
         {
              File.Delete(Request.PhysicalApplicationPath + app_settings.login_images + txtUploadStatus.Text);
              string filename = Path.GetFileName(btnFileUpload.FileName);
              btnFileUpload.SaveAs(Request.PhysicalApplicationPath + app_settings.login_images + filename);
         }
         catch (Exception ex)
         {
               Message(ex.ToString());
         }
      }
}

Inoltre, dovrei notare che la cartella che sto cercando di eliminare ha il pieno controllo dei servizi di rete.

Il messaggio di eccezione completo è:

System.UnauthorizedAccessException: accesso al percorso 'C: \ Users \ gowdyn \ Documents \ Visual Studio 2008 \ Projects \ hybrid \ hybrid \ temp_loginimages \ enviromental.jpg' è negato. su System.IO .__ Error.WinIOError (Int32 errorCode, String maybeFullPath) su System.IO.File.Delete (percorso String) su hybrid.User_Controls.Imgloader_Add_Edit_Tbl.btnUpdate_Click (mittente oggetto, EventArgs e) in C: \ Users \ gowd Documents \ Visual Studio 2008 \ Progetti \ hybrid \ hybrid \ User_Controls \ Imgloader_Add_Edit_Tbl.ascx.cs: linea 242

Qualche idea?


4
Cosa non è chiaro sull'eccezione? L'account con cui è in esecuzione l'applicazione non dispone dei privilegi di accesso al file / cartella.
Oded,

8
Capisco cosa sta dicendo l'eccezione. Il problema è che questa funzionalità viene utilizzata da alcuni utenti che devono modificare le immagini utilizzando il sistema. Parte di ciò sta sostituendo le immagini cancellando la vecchia immagine e salvando una nuova immagine.
Nick Gowdy,

Controlla le tue autorizzazioni di accesso alla cartella. concedere le autorizzazioni appropriate alla cartella utilizzando la scheda di sicurezza dalla finestra delle proprietà
gasroot,

6
L'eccezione non è affatto informativa. Non ti dice: A. Quale entità principale sta tentando di accedere alla risorsa B. Di quale autorizzazione ha bisogno. Per scoprirlo, richiede l'installazione di Windows SysInternals e il monitoraggio dell'accesso al percorso.
ATL_DEV,

Risposte:


184

Secondo il metodo File.Delete ...

Un UnauthorizedAccessExceptionsignifica una delle 4 cose:

  • Il chiamante non dispone dell'autorizzazione richiesta.
  • Il file è un file eseguibile in uso.
  • Path è una directory.
  • Path ha specificato un file di sola lettura.

77
Path è una directory. Imbarazzante per me: /
Per G

4
Mi è successo ieri facepalm . Odio questi ambigui messaggi di eccezione :(
Broken_Window

1
Ho lottato per oltre 6 ore e dopo aver esaminato la tua risposta ho visto che il percorso era directory ... grazie mille @CrazyTim ..
Utente M

6
Path is a directory.grazie per questo suggerimento :) Mi ha aiutato.
Sidron,

8
Oh mio ... Path è una directory. Grazie Microsoft. È un accesso MOLTO non autorizzato.
SeriousM,

181

Ho anche avuto il problema, quindi mi sono imbattuto in questo post. Ho aggiunto la seguente riga di codice prima e dopo una copia / eliminazione.

Elimina

File.SetAttributes(file, FileAttributes.Normal);
File.Delete(file);

copia

File.Copy(file, dest, true);
File.SetAttributes(dest, FileAttributes.Normal);

17
Ho dato "Tutti" i permessi completi alla cartella senza successo. In qualche modo questi attributi di file hanno funzionato però. Grazie. Vorrei che MS si accontentasse finalmente di un modello di sicurezza adeguato. Cercare di capire il motivo per cui Copia / Cancella esplode ogni pochi anni è a dir poco frustrante.
Steve

13
SetAttributes Normal era il trucco per me - stavo cercando di File.Copy e sovrascrivo un file di sola lettura ..
Tom Hunter

6
L'accesso al percorso negato non suggerisce che il file sia di sola lettura (dal momento che si ha effettivamente accesso al percorso!) A mio avviso, il messaggio di errore dovrebbe essere modificato. Grazie comunque per il suggerimento!
MBoros,

1
Ho eseguito il programma come amministratore e il problema era scomparso.
Santiago Villafuerte,

5
In che modo è utile impostare un attributo dopo un'operazione di copia? L'arresto anomalo del programma non è già presente nell'istruzione copy? Dovrebbe essere prima dell'operazione di copia proprio come l'operazione di eliminazione?
Vibhore Tanwer,

31

Questo è un vecchio problema, ma mi sono imbattuto in esso durante la ricerca. Si scopre che mi mancava il componente del nome file effettivo nel percorso di salvataggio per SaveAs ...

string uploadPath = Server.MapPath("~/uploads");
file.SaveAs(uploadPath); // BAD
file.SaveAs(Path.Combine(uploadPath, file.FileName)); // GOOD

18

Quando un utente tenta di connettersi al sito Web, IIS assegna la connessione all'account IUSER_ComputerName , dove ComputerName è il nome del server su cui è in esecuzione IIS. Per impostazione predefinita, l' account IUSER_ComputerName è un membro del gruppo Guests. Questo gruppo ha restrizioni di sicurezza. Prova ad accedere in modo completo a IUSER_ComputerName per quella cartella

Ecco un'ottima risposta descritta sulla sicurezza di IIS

Spero che questo ti aiuti


Grazie aiutato .. Autorizzazione per l'utente IIS_IUSRS.
Tom,

13

Fare clic con il tasto destro su Visual Studio e fare clic su Esegui come amministratore


Questa era la soluzione per il mio problema File.Move su un computer Windows 8.1 Enterprise su cui ero amministratore locale e nient'altro aveva un handle sui file.
Robert Kerr,

13

Ho ricevuto l'errore perché non mi rendevo conto che la destinazione dovrebbe essere un file. Avevo una cartella come secondo parametro (che funziona in cmd). e ho capito Unhandled Exception: System.UnauthorizedAccessException: Access to the path is denied.perché C # File.Movevuole un file lì, non solo per il primo parametro, ma anche per il secondo, e quindi se metti una directory come secondo parametro, sta cercando di scrivere un file come c:\crpquando hai una directory chiamata c:\crp.

questo sarebbe errato File.Move(args[0],"c:\\crp");

Quindi, questo sarebbe corretto File.Move(args[0],"c:\\crp\\a.a");

Lo stesso vale per File.Copy


1
Grazie! Ciò ha risolto indirettamente un problema in cui un'API si aspettava una destinazione che ho fornito come directory, non rendendosi conto che doveva includere il nome file (poiché l'oggetto stesso ha un nome file associato).
Austin Salgat,

7

Se si tratta di un sito Web IIS che presenta il problema, controllare la proprietà Identity delle impostazioni avanzate per il pool di applicazioni utilizzato dal sito o dall'applicazione. È possibile che sia impostato su ApplicationPoolIdentity e, in tal caso, questo è l'utente che dovrà avere accesso al percorso.

Oppure puoi passare al vecchio stile e semplicemente impostare Identità su Servizio di rete e dare all'utente il servizio di rete l'accesso al percorso.


3

È necessario modificare i privilegi della cartella da cui si sta tentando di eliminare / salvare. Fare clic con il tasto destro del mouse sulla cartella contenente e utilizzare la scheda Sicurezza per consentire i diritti di modifica per l'utente con cui viene eseguita l'applicazione.


stai supponendo che sia l'amministratore della sua macchina .. se questa è una macchina di lavoro ed è solo un utente .. probabilmente hanno impostato le autorizzazioni in quel modo per un motivo .. dato che ci resta solo da supporre
MethodMan

1
È una macchina da lavoro e io sono un utente esperto. Non accedo come amministratore. Le proprietà della cartella dell'immagine sono state modificate in modo che i servizi di rete abbiano pieno accesso. Ma questo non ha fatto alcuna differenza.
Nick Gowdy,

1
Ho appena aggiunto "Tutti" con pieno accesso alla cartella e "voilá"
MarceloBarbosa,

3

Eccezione generata quando il sistema operativo nega l'accesso a causa di un errore I / O o di un tipo specifico di errore di sicurezza.

Ho colpito la stessa cosa. Verificare che il file NON sia NASCOSTO.


3

Ho anche affrontato questo problema quando il mio servizio di finestra ha iniziato a lanciare l'eccezione

System.UnauthorizedAccessException: Access to the path "C:\\Order\\Media
44aa4857-3bac-4a18-a307-820450361662.mp4" is denied.

Quindi, come soluzione, ho verificato l'account utente associato al mio servizio, come mostrato nella seguente schermata di acquisizione

inserisci qui la descrizione dell'immagine

Quindi nel mio caso era il SERVIZIO DI RETE

E poi è andato alle proprietà della cartella per verificare se l'account utente associato esiste anche nella loro scheda di autorizzazione. Mancava nel mio caso e quando l'ho aggiunto e risolto il mio problema.

Per ulteriori informazioni, consultare la schermata seguente

inserisci qui la descrizione dell'immagine


3

stesso problema anche per me, stavo puntando la cartella anziché il file.

quindi assicurati nel percorso, specifica path + nomefile

System.IO.File.WriteAllBytes("path", bytearray);

2

Controlla le proprietà dei tuoi file. Se la sola lettura è selezionata, deselezionala. Questo era il mio problema personale con UnauthorizedAccessException.


2

Ho riscontrato questo errore e l'ho risolto in un attimo. Non so perché tutte le mie cartelle sono di sola lettura , Ho annullato la sola lettura e l'ho applicata. Tuttavia, è ancora di sola lettura. Quindi ho spostato il file nella cartella principale, funziona - così strano.


2

Un'eccezione UnauthorizedAccessException viene generata quando il sistema operativo nega l'accesso a causa di un errore I / O o di un errore di sicurezza.

Se si sta tentando di accedere a un file o una chiave di registro, assicurarsi che non sia di sola lettura .


2

Se stai usando BitDefender ci sono buone probabilità che la sua funzione Safe Files abbia bloccato l'operazione. Questa è una forma di protezione Ransomware fornita con alcune delle sue versioni più avanzate.

Assicurati di concedere l'accesso alla tua applicazione in BitDefender e riprova.

Alcuni dettagli in più sono disponibili in questa pagina di supporto di BitDefender .


1

Ho avuto lo stesso problema su un sito Web appena spostato su un server condiviso. Risolto tramite il pannello host web (DotNetPanel) impostando su "permetti di scrittura". Quindi, se ti trovi in ​​un server condiviso prima di rivedere tutto il codice vale la pena dare un'occhiata alla configurazione del server e potresti risparmiare molto tempo.


1

Tenere presente che se si sta tentando di raggiungere un percorso di cartella condivisa dal proprio codice, non è necessario fornire solo le autorizzazioni appropriate alla cartella fisica tramite la scheda di sicurezza. È inoltre necessario "condividere" la cartella con l'utente del pool di app corrispondente tramite la scheda Condividi


1

Stavo affrontando questo errore perché

A volte quando ho Combineil percorso con Nome file eFileName = ""

Diventa Path Directorynon una fileche è un problema come sopra menzionato

quindi è necessario verificare in FileNamequesto modo

if(itemUri!="")
        File.Delete(Path.Combine(RemoteDirectoryPath, itemUri));

1

Ho avuto l'errore esatto durante l'eliminazione di un file. Era un servizio Windows in esecuzione con un account di servizio che non era in grado di eliminare un documento .pdf da una cartella condivisa anche se aveva il controllo completo della cartella.

Ciò che ha funzionato per me è stato accedere alla scheda Sicurezza della cartella condivisa> Avanzate> Condividi> Aggiungi.

Ho quindi aggiunto l'account del servizio al gruppo amministratori, ho applicato le modifiche e l'account del servizio è stato quindi in grado di eseguire tutte le operazioni su tutti i file all'interno di quella cartella.


1

Per coloro che cercano di creare un'applicazione UWP (Windows universale), le autorizzazioni per i file sono molto più limitate e, in generale, viene negato per impostazione predefinita. Sostituisce anche le autorizzazioni dell'utente di sistema. Fondamentalmente avrai accesso ai file solo in entrambi

  • La posizione di installazione
  • La tua posizione AppData
  • File selezionati tramite il selettore File o Cartella
  • Posizioni richieste nel Manifest dell'app

Puoi leggere di più qui per dettagli => https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions


1

Nel mio caso il problema era Norton. Il mio programma interno non ha la firma digitale corretta e quando ha tentato di eliminare un file ha generato UnauthorizedAccessException.

inserisci qui la descrizione dell'immagine

Se ti dà una notifica, puoi gestirla da lì. Nel mio caso non ha dato una notifica che ho notato. Ecco quindi come impedire a Norton di bloccare il programma.

  1. Apri Norton
  2. Fai clic sulla freccia giù
  3. Fai clic su Cronologia
  4. Trova attività per programma
  5. Fai clic su Altre opzioni
  6. Fai clic su Escludi processo

0

Anch'io ho affrontato lo stesso problema quando provavo a farlo dopo la distribuzione sul server:

dirPath = Server.MapPath(".") + "\\website\\" + strUserName;
if (!Directory.Exists(dirPath))
{
    DirectoryInfo DI = Directory.CreateDirectory(dirPath);
}
string filePath = Server.MapPath(".") + "\\Website\\default.aspx";
File.Copy(filePath, dirPath + "\\default.aspx", true);
File.SetAttributes(dirPath + "\\default.aspx", FileAttributes.Normal);

Ho concesso l'autorizzazione in IIS ad altri gruppi incluso l'amministratore e il mio problema è stato risolto.


0

Ho scoperto che questo errore può verificarsi in MODALITÀ DESIGN al contrario di? modalità di esecuzione ... Se stai facendo qualcosa come la creazione di un membro della classe che richiede l'accesso a un file .INI o .HTM (file di configurazione, file della guida), potresti NON inizializzare l'elemento nella dichiarazione, ma inizializzarlo in seguito in FORM_Load () ecc ... Quando si inizializza ... Utilizzare un'istruzione IF di guardia:

    /// <summary>FORM: BasicApp - Load</summary>
    private void BasicApp_Load(object sender, EventArgs e)
    {
        // Setup Main Form Caption with App Name and Config Control Info
        if (!DesignMode)
        {
            m_Globals = new Globals();
            Text = TGG.GetApplicationConfigInfo();
        }
    }

Ciò impedirà a Designer MSVS di provare a creare un file INI o HTM quando si è in modalità progettazione.


0

Ho avuto questo errore quando ho provato a rinominare una cartella molto rapidamente dopo che era stata spostata o creata.

Un semplice System.Threading.Thread.Sleep(500);risolto:

void RenameFile(string from, string to)
{
   try
   {   
      System.IO.File.Move(from, to)      
   }   
   catch 
   {  
       System.Threading.Thread.Sleep(500);      
       RenameFile(from, to);      
   }   
}

Pensa che sarebbe meglio se tu verificassi l'esistenza della cartella prima di spostarla invece di dormire per mezzo secondo ... se il sistema operativo è occupato, la mossa precedente potrebbe richiedere più di mezzo secondo e le tue spalle allo stesso problema.
Paul Zahra,

Questo pezzo di codice è molto pericoloso. Ripete il metodo RenameFile, indipendentemente dall'eccezione generata! Potrebbe causare l'arresto anomalo dell'app se la causa dell'eccezione è un reale problema di autorizzazione
Hossein Shahdoost,

0

Nel mio caso particolare stavo creando ed eliminando ripetutamente 10000 cartelle. Mi sembra che il problema fosse che, sebbene il metodo Directory.Delete(path, true)ritorni, il meccanismo del sistema operativo sottostante potrebbe comunque eliminare i file dal disco. E quando sto iniziando a creare nuove cartelle immediatamente dopo l'eliminazione di quelle vecchie, alcune sono ancora bloccate perché non sono ancora state completamente eliminate. E sto ottenendo System.UnauthorizedAccessException: "L'accesso al percorso è negato".

inserisci qui la descrizione dell'immagine

L'uso di Thread.Sleep(5000)after Directory.Delete(path, true)risolve questo problema. Sono assolutamente d'accordo sul fatto che ciò non sia sicuro e non sto incoraggiando nessuno a usarlo. Mi piacerebbe qui un approccio migliore per risolvere questo problema e migliorare la mia risposta. Ora sto solo dando un'idea del perché questa eccezione può accadere.

class Program
{
    private static int numFolders = 10000;
    private static string rootDirectory = "C:\\1";

    static void Main(string[] args)
    {
        if (Directory.Exists(rootDirectory))
        {
            Directory.Delete(rootDirectory, true);
            Thread.Sleep(5000);
        }

        Stopwatch sw = Stopwatch.StartNew();
        CreateFolder();
        long time = sw.ElapsedMilliseconds;

        Console.WriteLine(time);
        Console.ReadLine();
    }

    private static void CreateFolder()
    {
        var one = Directory.CreateDirectory(rootDirectory);

        for (int i = 1; i <= numFolders; i++)
        {
            one.CreateSubdirectory(i.ToString());
        }
    }
}

0

Per prima cosa controlla il percorso se i due punti (:) mancano o meno dopo la lettera di unità. Se i due punti non mancano, puoi verificare se l'autorizzazione di accesso / scrittura è concessa per quel percorso. Avevo lo stesso problema e mi mancavano solo i due punti, il permesso e tutto il resto andava bene.

C:\folderpath

funzionerà bene ma,

C\folderpath .........(missing colon)

ti darà accesso errore di negazione.


0

Stavo cercando di utilizzare System.IO.File.OpenWrite (percorso)

e non ha funzionato perché stavo solo passando a OpenWrite () un percorso a una directory, ma richiede un percorso fino al file che si desidera scrivere. Pertanto, per evitare UnauthorizedAccessException, è necessario passare in OpenWrite un percorso completo che includa il nome file.


0

Mi sono anche imbattuto in questo post per occuparmi dello stesso problema. Sembra che il file sia in uso e quindi non sia in grado di scrivere su di esso. Sebbene non sia in grado di capirlo, quale processo lo sta usando. È stato disconnesso l'altro utente che aveva effettuato l'accesso in quella casella, non vedere alcun utente che lo sta trattenendo. Eventuali suggerimenti rapidi su come trovare lo stesso.

Grazie, Lakshay (sviluppatore)


Nella tua risposta non pubblicare una nuova domanda, ma prova a rispondere alla domanda del poster originale con informazioni utili. Per la tua domanda, cerca prima lo stackoverflow per domande uguali o simili. Se non ne trovi nessuna, pubblica una nuova domanda seguendo questa guida: Come fare una buona domanda
alev

0

Per risolvere questo problema, seguo l'approccio Scot Hanselman su Debugging System.UnauthorizedAccessException (spesso seguito da: accesso al percorso negato) articolo, il codice con l'esempio è sotto:

class Program
{
    static void Main(string[] args)
    {
        var path = "c:\\temp\\notfound.txt";
        try
        {
            File.Delete(path);
        }
        catch (UnauthorizedAccessException)
        {
            FileAttributes attributes = File.GetAttributes(path);
            if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
            {
                attributes &= ~FileAttributes.ReadOnly;
                File.SetAttributes(path, attributes);
                File.Delete(path);
            }
            else
            {
                throw;
            }
        }
    }
}
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.