Pourquoi l'accès au chemin est-il refusé?

156

J'ai un problème où j'essaye de supprimer mon fichier mais j'obtiens une exception.

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());
         }
      }
}

Je dois également noter que le dossier que j'essaie de supprimer a un contrôle total sur les services réseau.

Le message d'exception complet est:

System.UnauthorizedAccessException: l'accès au chemin d'accès «C: \ Users \ gowdyn \ Documents \ Visual Studio 2008 \ Projects \ hybrid \ hybrid \ temp_loginimages \ enviromental.jpg» est refusé. à System.IO .__ Error.WinIOError (Int32 errorCode, String peut-êtreFullPath) à System.IO.File.Delete (chemin de chaîne) à hybrid.User_Controls.Imgloader_Add_Edit_Tbl.btnUpdate_Click (expéditeur de l'objet, EventArgs e) dans C: \ Users \ gowdyn \ gowdyn Documents \ Visual Studio 2008 \ Projects \ hybrid \ hybrid \ User_Controls \ Imgloader_Add_Edit_Tbl.ascx.cs: ligne 242

Des idées?

nick gowdy
la source
4
Qu'est-ce qui n'est pas clair à propos de l'exception? Le compte sous lequel l'application s'exécute n'a pas de privilèges d'accès au fichier / dossier.
Oded le
8
Je comprends ce que dit l'exception. Le problème est que cette fonctionnalité est utilisée par certains utilisateurs qui ont besoin de modifier des images à l'aide du système. Une partie de cela consiste à remplacer les images en supprimant l'ancienne image et en enregistrant une nouvelle image.
nick gowdy
Vérifiez vos autorisations d'accès au dossier. donnez les autorisations appropriées au dossier en utilisant l'onglet de sécurité de la fenêtre des propriétés
gasroot
6
L'exception n'est pas du tout informative. Il ne vous dit pas: A. Quel principal essaie d'accéder à la ressource B. De quelle autorisation a-t-il besoin. Pour le savoir, il faut installer Windows SysInternals et surveiller l'accès au chemin.
ATL_DEV

Réponses:

184

Selon la méthode File.Delete ...

Un UnauthorizedAccessExceptionsignifie l'une des 4 choses suivantes:

  • L'appelant n'a pas l'autorisation requise.
  • Le fichier est un fichier exécutable en cours d'utilisation.
  • Le chemin est un répertoire.
  • Le chemin a spécifié un fichier en lecture seule.
CrazyTim
la source
77
Le chemin est un répertoire. Embarrassant pour moi: /
Per G
4
M'est arrivé hier facepalm . Je déteste ces messages d'exception ambigus :(
Broken_Window
1
J'ai eu du mal pendant plus de 6 heures et après avoir regardé votre réponse, j'ai vu que le chemin était un répertoire ... merci beaucoup @CrazyTim ..
Utilisateur M
6
Path is a directory.merci pour cette astuce :) Cela m'a aidé.
Sidron
8
Oh mon ... Path est un répertoire. Merci Microsoft. C'est un accès TRÈS non autorisé.
SeriousM
181

J'ai aussi eu le problème, donc je suis tombé sur ce post. J'ai ajouté la ligne de code suivante avant et après une copie / suppression.

Supprimer

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

Copie

File.Copy(file, dest, true);
File.SetAttributes(dest, FileAttributes.Normal);
Riaan de Lange
la source
17
J'ai donné toutes les autorisations à «Tout le monde» sur le dossier sans succès. Cependant, ces attributs de fichier ont fonctionné d'une manière ou d'une autre. Merci. Je souhaite que MS se décide enfin sur un modèle de sécurité approprié. Essayer de comprendre pourquoi Copy / Delete explose toutes les quelques années est pour le moins frustrant.
Steve
13
SetAttributes Normal était l'astuce pour moi - j'essayais de File.Copy et d'écraser un fichier en lecture seule ..
Tom Hunter
6
L'accès au chemin est refusé ne suggère pas que le fichier est simplement en lecture seule (puisque vous avez effectivement accès au chemin!) À mon avis, le message d'erreur devrait être changé. Merci pour l'indice quand même!
MBoros
1
J'ai exécuté le programme en tant qu'administrateur et le problème a disparu.
Santiago Villafuerte
5
Comment la définition d'un attribut après une opération de copie aide-t-elle? Le programme ne plantera-t-il pas déjà sur l'instruction de copie? Doit-il être avant l'opération de copie, tout comme l'opération de suppression?
Vibhore Tanwer
31

C'est un vieux problème, mais je l'ai rencontré lors de la recherche. Il s'avère que je manquais le composant de nom de fichier réel dans le chemin de sauvegarde pour SaveAs ...

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

Lorsqu'un utilisateur tente de se connecter à votre site Web, IIS attribue la connexion au compte IUSER_ComputerName , où ComputerName est le nom du serveur sur lequel IIS s'exécute. Par défaut, le compte IUSER_ComputerName est membre du groupe Invités. Ce groupe a des restrictions de sécurité. Essayez d'accéder à ce dossier à IUSER_ComputerName

Voici une très bonne réponse décrite sur la sécurité IIS

J'espère que cela t'aides

Arsen Mkrtchyan
la source
Merci pour votre aide. Autorisation pour l'utilisateur IIS_IUSRS.
Tom
13

Faites un clic droit sur Visual studio et cliquez sur Exécuter en tant qu'administrateur

Alexander Zaldostanov
la source
C'était la solution à mon problème File.Move sur une machine Windows 8.1 Entreprise sur laquelle j'étais administrateur local, et rien d'autre n'avait une poignée sur les fichiers.
Robert Kerr
13

J'ai eu l'erreur parce que je ne savais pas que la destination devait être un fichier. J'avais un dossier comme deuxième paramètre (qui fonctionne dans cmd). et j'ai obtenu Unhandled Exception: System.UnauthorizedAccessException: Access to the path is denied.parce que C # File.Moveveut un fichier là-bas, pas seulement pour le premier paramètre, mais aussi pour le second, et donc si vous mettez un répertoire comme deuxième paramètre, il essaie d'écrire un fichier comme c:\crplorsque vous avez un répertoire appelé c:\crp.

ce serait incorrect File.Move(args[0],"c:\\crp");

Donc, ce serait correct File.Move(args[0],"c:\\crp\\a.a");

Il en va de même File.Copy

barlop
la source
1
Je vous remercie! Cela a indirectement résolu un problème où une API attendait une destination que j'ai donnée comme répertoire, sans se rendre compte qu'elle devait inclure le nom de fichier (puisque l'objet lui-même a un nom de fichier associé).
Austin Salgat
7

S'il s'agit d'un site Web IIS qui rencontre le problème, vérifiez la propriété Identity des paramètres avancés du pool d'applications que le site ou l'application utilise. Vous pouvez trouver qu'il est défini sur ApplicationPoolIdentity, et dans ce cas, c'est l'utilisateur qui devra avoir accès au chemin.

Ou vous pouvez utiliser le style ancien et définir simplement l'identité sur le service réseau et donner à l'utilisateur du service réseau l'accès au chemin.

Bjørn Otto Vasbotten
la source
3

Vous devez modifier les privilèges du dossier dans lequel vous essayez de supprimer / enregistrer. Cliquez avec le bouton droit sur le dossier contenant et utilisez l'onglet Sécurité pour autoriser les droits de modification de l'utilisateur sous lequel votre application s'exécute.

Brissles
la source
vous supposez qu'il est l'administrateur de sa machine .. s'il s'agit d'une machine de travail et qu'il n'est qu'un utilisateur .. ils ont probablement configuré les autorisations de cette façon pour une raison .. puisque nous ne sommes plus qu'à assumer
MethodMan
1
C'est une machine de travail et je suis un utilisateur expérimenté. Je ne me connecte pas en tant qu'administrateur. Les propriétés du dossier d'image ont été modifiées afin que les services réseau aient un accès complet. Mais cela ne faisait aucune différence.
nick gowdy le
1
Je viens d'ajouter "Tout le monde" avec un accès complet au dossier, et "voilá"
MarceloBarbosa
3

Exception levée lorsque le système d'exploitation refuse l'accès en raison d'une erreur d'E / S ou d'un type spécifique d'erreur de sécurité.

J'ai frappé la même chose. Vérifiez que le fichier n'est PAS CACHÉ.

Ron H
la source
3

J'ai également rencontré ce problème lorsque mon service de fenêtre a commencé à lever l'exception

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

Donc, comme solution, j'ai vérifié le compte utilisateur associé à mon service, comme indiqué dans la capture d'écran ci-dessous

entrez la description de l'image ici

Donc, dans mon cas, c'était SERVICE RÉSEAU

Et puis est allé dans les propriétés du dossier pour vérifier si le compte d'utilisateur associé existe également sous leur onglet d'autorisation. Il manquait dans mon cas et quand je l'ai ajouté et cela a résolu mon problème.

Pour plus d'informations, veuillez consulter la capture d'écran ci-dessous

entrez la description de l'image ici

Jitender Kumar
la source
3

même problème pour moi aussi, je pointais le dossier au lieu du fichier.

alors assurez-vous que dans chemin, donnez chemin + nom de fichier

System.IO.File.WriteAllBytes("path", bytearray);
jineesh vp
la source
2

Vérifiez les propriétés de vos fichiers. Si la lecture seule est cochée, décochez-la. C'était mon problème personnel avec l'exception UnauthorizedAccessException.

user3238433
la source
2

J'ai eu cette erreur et je l'ai résolue en un instant. Je ne sais pas pourquoi tous mes dossiers sont en lecture seule , J'ai annulé la lecture seule et je l'applique. Cependant, il est toujours en lecture seule. J'ai donc déplacé le fichier dans le dossier racine, cela fonctionne - tellement bizarre.

MOLLMY
la source
2

Une exception UnauthorizedAccessException est levée lorsque le système d'exploitation refuse l'accès en raison d'une erreur d'E / S ou d'une erreur de sécurité.

Si vous essayez d'accéder à un fichier ou à une clé de registre, assurez-vous qu'il n'est pas en lecture seule .

reza.Nikmaram
la source
2

Si vous utilisez BitDefender, il y a de fortes chances que sa fonction Safe Files bloque votre opération. Il s'agit d'une forme de protection contre les ransomwares fournie avec certaines de ses versions les plus avancées.

Assurez-vous d'accorder à votre application l'accès dans BitDefender et réessayez.

Vous trouverez plus de détails sur cette page de support BitDefender .

Vlad Schnakovszki
la source
1

J'ai eu le même problème sur un site Web récemment déplacé sur un serveur partagé. Résolu par le biais du panneau de l'hôte Web (DotNetPanel) définissant la valeur "Autoriser les autorisations d'écriture". Donc, si vous êtes sur un serveur partagé avant de passer en revue tout le code, il vaut la peine de jeter un coup d'œil à la configuration du serveur et cela pourrait vous faire gagner beaucoup de temps.

Drakell
la source
1

Sachez que si vous essayez d'atteindre un chemin de dossier partagé à partir de votre code, vous n'avez pas seulement besoin de donner les autorisations appropriées au dossier physique via l'onglet de sécurité. Vous devez également «partager» le dossier avec l'utilisateur du pool d'applications correspondant via l'onglet Partager

Kacho
la source
1

J'étais confronté à cette erreur car

Parfois, lorsque je Combinele chemin avec le nom de fichier etFileName = ""

Ce Path Directoryn'est pas devenu fileun problème comme mentionné ci-dessus

donc vous devez vérifier FileNamecomme ça

if(itemUri!="")
        File.Delete(Path.Combine(RemoteDirectoryPath, itemUri));
Basheer AL-MOMANI
la source
1

J'ai eu l'erreur exacte lors de la suppression d'un fichier. Il s'agissait d'un service Windows exécuté sous un compte de service qui ne pouvait pas supprimer un document .pdf d'un dossier partagé même s'il avait le contrôle total du dossier.

Ce qui a fonctionné pour moi était de naviguer vers l'onglet Sécurité du dossier partagé> Avancé> Partager> Ajouter.

J'ai ensuite ajouté le compte de service au groupe des administrateurs, appliqué les modifications et le compte de service a ensuite pu effectuer toutes les opérations sur tous les fichiers de ce dossier.

LuTheZy
la source
1

Pour ceux qui essaient de créer une application UWP (Universal Windows), les autorisations sur les fichiers sont beaucoup plus restreintes et sont généralement refusées par défaut. Il remplace également les autorisations des utilisateurs système. En gros, vous n'aurez accès qu'aux fichiers dans l'un ou l'autre

  • Votre emplacement d'installation
  • Votre emplacement AppData
  • Fichiers sélectionnés via le sélecteur de fichiers ou de dossiers
  • Emplacements demandés dans votre manifeste d'application

Vous pouvez en savoir plus ici pour plus de détails => https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions

Tezra
la source
1

Dans mon cas, le problème était Norton. Mon programme interne n'a pas la signature numérique appropriée et lorsqu'il a essayé de supprimer un fichier, il a donné l'exception UnauthorizedAccessException.

entrez la description de l'image ici

S'il vous donne une notification, vous pouvez le gérer à partir de là. Dans mon cas, il n'a pas donné de notification que j'ai remarquée. Alors, voici comment empêcher Norton de bloquer le programme.

  1. Ouvrez Norton
  2. Cliquez sur la flèche vers le bas
  3. Historique des clics
  4. Rechercher une activité par programme
  5. Cliquez sur Plus d'options
  6. Cliquez sur Exclure le processus
D_Bester
la source
0

J'ai aussi rencontré le même problème en essayant de le faire après le déploiement sur le serveur:

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);

J'ai accordé l'autorisation dans IIS à un autre groupe, y compris l'administrateur, et mon problème a été résolu.

Manish Singh
la source
0

J'ai trouvé que cette erreur peut se produire en MODE CONCEPTION par opposition à? mode d'exécution ... Si vous faites quelque chose comme la création d'un membre de classe qui nécessite l'accès à un fichier .INI ou .HTM (fichier de configuration, fichier d'aide), vous voudrez peut-être NE PAS initialiser l'élément dans la déclaration, mais l'initialiser plus tard dans FORM_Load () etc ... Lorsque vous initialisez ... Utilisez une instruction IF de garde:

    /// <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();
        }
    }

Cela empêchera le concepteur MSVS d'essayer de créer un fichier INI ou HTM lorsque vous êtes en mode conception.

Terry
la source
0

J'ai eu cette erreur lorsque j'ai essayé de renommer un dossier très rapidement après qu'il ait été déplacé ou créé.

Un simple l'a System.Threading.Thread.Sleep(500);résolu:

void RenameFile(string from, string to)
{
   try
   {   
      System.IO.File.Move(from, to)      
   }   
   catch 
   {  
       System.Threading.Thread.Sleep(500);      
       RenameFile(from, to);      
   }   
}
Arjan de Bruijn
la source
Pensez que ce serait mieux si vous vérifiiez si le dossier existait avant de le déplacer plutôt que de dormir pendant une demi-seconde ... si le système d'exploitation est occupé, le déplacement précédent peut prendre plus d'une demi-seconde et vous revenez au même problème.
Paul Zahra
Ce morceau de code est très dangereux. Il répète la méthode RenameFile quelle que soit l'exception lancée! Cela pourrait provoquer le plantage de l'application si la cause de l'exception est un problème d'autorisation réel
Hossein Shahdoost
0

Dans mon cas particulier, je créais et supprimais à plusieurs reprises 10000 dossiers. Il me semble que le problème résidait dans le fait que, bien que la méthode Directory.Delete(path, true)retourne, le mécanisme du système d'exploitation sous-jacent peut toujours supprimer les fichiers du disque. Et lorsque je commence à créer de nouveaux dossiers immédiatement après la suppression des anciens, certains d'entre eux sont toujours verrouillés car ils ne sont pas encore complètement supprimés. Et j'obtiens System.UnauthorizedAccessException: "L'accès au chemin est refusé".

entrez la description de l'image ici

Utiliser Thread.Sleep(5000)après Directory.Delete(path, true)résout ce problème. Je suis tout à fait d'accord que ce n'est pas sûr et je n'encourage personne à l'utiliser. J'aimerais ici une meilleure approche pour résoudre ce problème afin d'améliorer ma réponse. Maintenant, je donne juste une idée pourquoi cette exception peut se produire.

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());
        }
    }
}
Aleksei Mialkin
la source
0

Tout d'abord, vérifiez simplement le chemin si le caractère deux-points (:) est manquant ou non après la lettre du lecteur. Si deux points ne sont pas manquants, vous pouvez vérifier si l'autorisation d'accès / d'écriture est accordée pour ce chemin. J'ai eu le même problème et il ne me manquait que le colon, la permission et tout le reste allait bien.

C:\folderpath

fonctionnera bien mais,

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

vous donnera une erreur de refus d'accès.

Vijay Dodamani
la source
0

J'essayais d'utiliser System.IO.File.OpenWrite (chemin)

et cela n'a pas fonctionné parce que je ne faisais que passer à OpenWrite () un chemin vers un répertoire, mais cela nécessite un chemin jusqu'au fichier que vous voulez écrire. Ainsi, un chemin complet comprenant le nom de fichier.extension à la fin doit être passé dans OpenWrite pour éviter UnauthorizedAccessException

SeanMC
la source
0

J'ai également rencontré ce post comme traitant du même problème. Il semble que le fichier est en cours d'utilisation et ne peut donc pas y écrire. Bien que incapable de le comprendre, quel processus l'utilise. Déconnecté l'autre utilisateur qui était connecté dans cette boîte, ne voyez aucun utilisateur qui le détient. Des conseils rapides sur la façon de trouver la même chose.

Merci, Lakshay (développeur)

Lakshay Gupta
la source
Dans votre réponse, ne postez pas de nouvelle question, mais essayez de répondre à la question de l'affiche originale avec des informations utiles. Pour votre propre question, veuillez d'abord rechercher stackoverflow pour les mêmes questions ou des questions similaires. Si vous n'en trouvez pas, postez une nouvelle question en suivant ce guide: Comment poser une bonne question
alev
0

Pour résoudre ce problème, je suis l'approche Scot Hanselman dans l'article Debugging System.UnauthorizedAccessException (souvent suivi de: L'accès au chemin est refusé) , le code avec l'exemple est ci-dessous:

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;
            }
        }
    }
}
Antonio Leonardo
la source