Pourquoi l'accès au chemin d'accès refusé?

j'ai un problème lorsque j'essaie 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 aussi noter que le dossier que j'essaie de supprimer a le contrôle complet des services réseau.

le message d'exception complet est:

Système

.Nonauthorizedaccessexception: accès au chemin "C:UsersgowdynDocumentsVisual Studio 2008Projectshybridhybrid temp_loginimagesenviromental.jpg' est refusé. at System.IO._ _ Erreur.WinIOError (Int32 errorCode, String maybeFullPath) au système.IO.File.Delete (String path) at hybrid.User_Controls.Imgloader_Add_Edit_Tbl.btnUpdate_Click (object sender, EventArgs e) in C:UsersgowdynDocumentsVisual Studio 2008Projectshybridhybrid User_ControlsImgloader_Add_Edit_Tbl.ascx.cs: ligne 242

des idées?

107
demandé sur durron597 2012-01-11 18:58:41

21 réponses

j'ai aussi eu le problème, donc je trébuche 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);
149
répondu riaandelange 2012-07-17 13:12:07

D'après le fichier .Supprimer La Méthode ...

Un UnauthorizedAccessException désigne l'un des 4 choses:

  • L'appelant n'a pas l'autorisation requise.
  • le fichier est un fichier exécutable qui est utilisé.
  • Path est un répertoire.
  • chemin spécifié un fichier en lecture seule.
110
répondu CrazyTim 2016-03-15 11:55:56

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

string uploadPath = Server.MapPath("~/uploads");
file.SaveAs(uploadPath); // BAD
file.SaveAs(Path.Combine(uploadPath, file.FileName)); // GOOD
23
répondu Andrew Edvalson 2016-10-02 17:35:32

Lorsqu'un utilisateur essaie de se connecter à votre site web, IIS attribue la connexion au compte IUSER_ComputerName , où ComputerName est le nom du serveur sur lequel IIS est en cours d'exécution. Par défaut, le compte IUSER_ComputerName est un membre du groupe D'invités. Ce groupe a des restrictions de sécurité. Essayez d'élargir l'accès à IUSER_ComputerName à ce dossier

ici est très bien décrit répondre au sujet de la sécurité IIS

Espérons que cette aide

15
répondu Arsen Mkrtchyan 2017-05-23 12:26:07

faites un clic droit sur Visual studio et cliquez sur exécutez en tant qu'administrateur

8
répondu Alexander Zaldostanov 2016-02-24 16:02:41

si c'est un site IIS qui a le problème, vérifiez la propriété D'identité des paramètres avancés pour le pool d'applications que le site ou l'application utilise. Vous pouvez trouver qu'il est défini à ApplicationPoolIdentity, et dans ce cas, alors c'est l'utilisateur qui aura accès au chemin d'accès.

ou vous pouvez passer à l'ancienne et simplement définir L'identité au service réseau, et donner à l'utilisateur du service réseau l'accès au chemin.

6
répondu Bjørn Otto Vasbotten 2015-09-30 17:50:26

j'ai eu l'erreur parce que je ne savais pas que dest devait être un fichier. J'avais un dossier comme second paramètre(qui fonctionne dans cmd). et j'ai eu Unhandled Exception: System.UnauthorizedAccessException: Access to the path is denied. parce que c# File.Déplacer veut un fichier, pas seulement pour le premier paramètre, mais pour la deuxième, et ainsi si vous mettez un répertoire en tant que second paramètre, c'est d'essayer d'écrire un fichier comme c:\crp quand 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 pour File.Copy

6
répondu barlop 2016-04-26 11:11:47

L'exception est 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é.

3
répondu user1209939 2016-02-25 08:18:50

j'ai eu cette erreur et résolu dans un instant. Je ne sais pas pourquoi tous mes dossiers sont en lecture seule. Cependant, il est toujours en lecture seule. Donc j'ai déplacé le fichier dans le dossier racine, ça marche - tellement bizarre.

2
répondu MOLLMY 2017-07-10 12:27:29

vous devez modifier les privilèges du dossier que vous essayez de supprimer de/save to. Cliquez avec le bouton droit de la souris sur le dossier contenant et utilisez l'onglet Sécurité pour autoriser modifier Droits De l'utilisateur sous lequel votre application se déroule.

1
répondu Brissles 2012-01-11 15:04:45

j'ai eu le même problème sur un déplacé site web sur un serveur partagé. Résolu par le panneau d'hôte web (DotNetPanel) en définissant true les "permissions d'écriture". Donc, si vous êtes dans un serveur partagé avant de passer en revue tout le code qui vaut la peine de jeter un coup d'oeil à la configuration du serveur et pourrait vous faire gagner beaucoup de temps.

1
répondu Drakell 2013-07-19 19:31:12

soyez conscient que si vous essayez d'atteindre un chemin de dossier partagé à partir de votre code, vous n'avez pas seulement besoin de donner les permissions appropriées au dossier physicial à travers l'onglet Sécurité. Vous devez également "partager" le dossier avec l'utilisateur du pool d'applications correspondant à travers L'onglet

1
répondu Kacho 2013-07-22 20:20:30

Vérifiez vos propriétés de fichiers. Si la lecture seule est cochée, décochez-la. C'était mon problème personnel avec L'Exception D'accès non autorisé.

1
répondu user3238433 2014-07-03 14:26:55

je faisais face à cette erreur parce que

parfois quand je Combine le chemin avec nom de fichier et FileName = ""

il devient Path Directory pas un file qui est un problème comme mentionné ci-dessus

, donc vous devez vérifier pour FileName comme ceci

if(itemUri!="")
        File.Delete(Path.Combine(RemoteDirectoryPath, itemUri));
1
répondu Basheer AL-MOMANI 2017-05-23 11:47:24

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

si vous tentez d'accéder à un fichier ou à une clé de Registre, assurez-vous qu'il s'agit de pas en lecture seule .

1
répondu reza.Nikmaram 2018-06-19 04:13:25

j'ai eu l'erreur exacte lors de la suppression d'un fichier. Il s'agissait d'un service Windows fonctionnant sous un compte de Service qui n'était pas en mesure de supprimer A.document pdf à partir d'un dossier partagé même s'il avait le contrôle total du dossier.

ce qui a fonctionné pour moi était de naviguer dans l'onglet Sécurité du dossier partagé > avancé > Partager > Ajouter.

j'ai ensuite ajouté le compte de service au groupe des administrateurs, j'ai appliqué les changements et le compte de service était alors en mesure d'effectuer toutes les opérations sur tous les fichiers dans ce dossier.

1
répondu LuTheZy 2018-08-01 10:02:04

j'ai également fait face à ce problème lorsque mon service de fenêtres a commencé à lancer 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 d'utilisateur associé à mon service, comme indiqué dans la capture d'écran ci-dessous

enter image description here

donc dans mon cas c'était service de réseau

puis est allé dans le dossier propriétés pour vérifier si le compte utilisateur associé existe également sous l'onglet "permission". Il manquait dans mon cas, et quand je l'ai ajouté et il a fixé mon problème.

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

enter image description here

1
répondu Jitender Kumar 2018-08-02 12:07:54

j'ai moi 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é la permission dans IIS à un autre groupe y compris administrateur et mon problème a été résolu.

0
répondu Manish Singh 2012-02-02 12:37:44

j'ai constaté que cette erreur peut se produire en mode de conception par opposition à ? mode d'exécution... Si vous faites quelque chose comme créer un membre de classe qui nécessite l'accès à un .INI or .Fichier HTM (fichier de configuration, Fichier d'aide) vous pouvez ne pas vouloir initialiser l'élément dans la déclaration, mais l'initialiser plus tard dans FORM_Load () etc... Lorsque vous NE initialiser... Utilisez un garde si la déclaration:

    /// <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 de MSVS d'essayer de créer un fichier INI ou HTM lorsque vous êtes en mode design.

0
répondu Terry 2014-02-17 14:09:19

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

un simple 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);      
   }   
}
0
répondu Arjan de Bruijn 2014-09-18 21:04:53

dans mon cas particulier, je créais et supprimais à plusieurs reprises 10000 dossiers. Il me semble que le problème était que, bien que la méthode Directory.Delete(path, true) retourne, le mécanisme sous-jacent de L'OS peut encore être la suppression des fichiers à partir du disque. Et quand je commence à créer de nouveaux dossiers immédiatement après la suppression d'anciens dossiers, certains d'entre eux sont toujours verrouillés parce qu'ils ne sont pas encore complètement supprimés. Et je suis du Système.Exception d'accès non autorisé: "L'accès au chemin est refusé".

enter image description here

en utilisant Thread.Sleep(5000) après Directory.Delete(path, true) résout ce problème. Je suis tout à fait d'accord pour dire que ce n'est pas sûr, et je n'encourage personne à s'en servir. 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 de la raison pour laquelle 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());
        }
    }
}
0
répondu Aleksei Mialkin 2018-08-21 06:37:42