web-dev-qa-db-fra.com

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

Je rencontre un problème lorsque j'essaie de supprimer mon fichier, mais je reçois 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());
         }
      }
}

De plus, je dois noter que le dossier que je tente de supprimer contrôle totalement les services réseau.

Le message d'exception complet est:

System.UnauthorizedAccessException: l'accès au chemin "C:\Utilisateurs\gowdyn\Documents\Visual Studio 2008\Projets\hybrid\hybrid\temp_loginimages\enviromental.jpg" est refusé. sur System.IO .__ Error.WinIOError (Int32 errorCode, String MaybeFullPath) sur System.IO.File.Delete (Chemin de la chaîne) sur hybrid.User_Controls.Imgloader_Add_Edit_Tbl.btnUpdate_Click (Object sender, EventArgs e) dans C:\Users\gowdyn Documents\Visual Studio 2008\Projets\hybrid\hybrid\User_Controls\Imgloader_Add_Edit_Tbl.ascx.cs: ligne 242 

Des idées?

124
nick gowdy

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

Effacer

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

Copie

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

Selon Méthode File.Delete ...

Un UnauthorizedAccessException signifie 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.
  • Path est un répertoire.
  • Path spécifie un fichier en lecture seule.
129
CrazyTim

C'est un vieux problème, mais je l'ai rencontré en cherchant. Il s'avère qu'il me manquait le composant du 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
25
Andrew Edvalson

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 est exécuté. 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 à IUSER_ComputerName à ce dossier

Ici est très bonne réponse décrite sur la sécurité IIS

J'espère que cela t'aides

16
Arsen Mkrtchyan

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

8
Alexander Zaldostanov

J'ai eu l'erreur parce que je n'avais pas réalisé que la destination devait être un fichier. J'ai eu 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.Move veut un fichier ici, pas seulement pour le premier paramètre, mais aussi pour le second, et donc si vous mettez un répertoire comme second paramètre, il essaie 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

7
barlop

S'il s'agit d'un site Web IIS qui rencontre le problème, vérifiez la propriété Identité des paramètres avancés du pool d'applications utilisé par le site ou l'application. Vous constaterez peut-être qu'il est défini sur ApplicationPoolIdentity et, dans ce cas, il s'agit de l'utilisateur qui devra avoir accès au chemin.

Vous pouvez également adopter un style ancien et définir simplement l'identité sur le service réseau, puis donner à l'utilisateur du service réseau l'accès au chemin.

6

L'exception levée lorsque le système d'exploitation refuse l'accès en raison d'une erreur d'entrée-sortie ou d'un type d'erreur de sécurité spécifique.

Je frappe la même chose. Vérifiez que le fichier n'est pas caché.

3
user1209939

J'ai eu cette erreur et 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'ai appliquée. Cependant, il est encore en lecture seule. Alors j'ai déplacé le fichier dans le dossier racine, ça marche - tellement bizarre.

2
MOLLMY

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

2
Brissles

le même problème pour moi aussi, Je pointais le dossier à la place du fichier. 

alors assurez-vous dans chemin, donnez chemin + nom du fichier

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

Sachez que si vous essayez d’atteindre un chemin de dossier partagé à partir de votre code, il n’est pas seulement nécessaire d’accorder les autorisations appropriées au dossier physique par le biais de l’onglet Sécurité. Vous devez également "partager" le dossier avec l'utilisateur du pool d'applications correspondant via l'onglet Partager.

1
Kacho

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

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

1
reza.Nikmaram

J'ai également rencontré ce problème lorsque mon service de fenêtre 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 NETWORK SERVICE

Ensuite, allez 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é, cela a résolu mon problème.

Pour plus d'informations s'il vous plaît vérifier la capture d'écran ci-dessous

 enter image description here

1
Jitender Kumar

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 et ne pouvant pas supprimer un document .pdf d’un dossier partagé alors qu’il disposait du contrôle total du dossier.

Ce qui a fonctionné pour moi a été la navigation dans 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 été en mesure d'effectuer toutes les opérations sur tous les fichiers de ce dossier.

1
LuTheZy

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.

1
user3238433

J'ai eu le même problème sur un site Web nouvellement déplacé sur un serveur partagé. Résolu via le panneau de l'hôte Web (DotNetPanel) en 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, jetez un œil à la configuration du serveur, cela pourrait vous faire gagner beaucoup de temps.

1
Drakell

Je faisais face à cette erreur parce que 

Parfois, lorsque je Combine le chemin avec nom de fichier et FileName = ""

Il devient Path Directory pas une file qui pose un problème tel que mentionné ci-dessus

vous devez donc vérifier FileName comme ceci

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

Dans mon cas particulier, je créais et supprimais à plusieurs reprises 10000 dossiers. Il me semble que le problème tient au fait que, bien que la méthode Directory.Delete(path, true) soit renvoyée, 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 d’anciens, certains d’entre eux sont toujours verrouillés car ils ne sont pas encore complètement supprimés. Et je reçois une exception System.UnauthorizedAccessException: "L'accès au chemin est refusé".

 enter image description here

Utiliser 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 à l’utiliser. J'aimerais ici une meilleure approche pour résoudre ce problème afin d'améliorer ma réponse. Maintenant, je ne fais que donner 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
Aleksei Mialkin

Commencez par vérifier le chemin si le caractère deux-points (:) est manquant ou non après la lettre du lecteur. Si les deux points ne manquent pas, vous pouvez vérifier si les droits d’accès/d’écriture sont accordés pour ce chemin .. J'ai le même problème et il ne me manquait que les deux points, 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.

0
Vijay Dodamani

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

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

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

0
Vlad Schnakovszki

J'ai trouvé que cette erreur peut se produire dans DESIGN MODE par opposition à? mode d'exécution ... Si vous créez, par exemple, un membre de la classe nécessitant l'accès à un fichier .INI ou .HTM (fichier de configuration, fichier d'aide), vous souhaiterez peut-être PAS initialiser l'élément dans la déclaration, mais: initialisez-le plus tard dans FORM_Load () etc ... Lorsque vous initialisez ... Utilisez une instruction guard SI:

    /// <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 Création.

0
Terry

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

et cela n'a pas fonctionné, car je ne faisais que passer à OpenWrite () un chemin d'accès à un répertoire, mais cela nécessite un chemin d'accès jusqu'au fichier que vous voulez écrire. Donc, un chemin complet, incluant le nom de fichier.extension à la fin, doit être passé à OpenWrite pour éviter les exceptions UnauthorizedAccessException.

0
SeanKPS

Cette erreur s'est produite lorsque j'ai essayé de renommer un dossier très rapidement après son déplacement ou sa création. 

Un simple System.Threading.Thread.Sleep(500); l'a 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
Arjan de Bruijn

J'ai moi aussi rencontré le même problème lorsque j'essayais de le faire après un 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 l'administrateur, et mon problème a été résolu. 

0
Manish Singh

Pour ceux qui essaient de créer une application UWP (Universal Windows), les autorisations sur les fichiers sont beaucoup plus limitées et, en général, refusées par défaut. Il remplace également les autorisations des utilisateurs du système. En gros, vous n’avez accès aux fichiers que dans

  • Votre emplacement d'installation
  • Votre emplacement AppData
  • Fichiers sélectionnés via Fichier ou Dossier picker
  • Emplacements demandés dans votre manifeste d'application

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

0
Tezra