2009-07-21 6 views
9

Je reçois un accès non autorisé ExceptionUnauthorizedAccessException essayer de supprimer un fichier dans un dossier dans lequel je peux supprimer des fichiers autres avec le même code

  • dans un fichier que je peux supprimer manuellement.
  • dans un dossier où je suis en mesure de supprimer par le code d'autres fichiers
  • et le fichier n'est pas marqué comme lu que
  • en plus, je suis sous Windows XP dans un PC autonome et je n'ai pas affecté des autorisations sur le dossier ou le fichier.
  • aucun autre processus utilise le fichier

Si elle aide, c'est le code où l'exception ocurrs:

protected void DeleteImage(string imageName) 
{ 
    if (imageName != null) 
    { 
     string f = String.Format("~/Images/{0}", imageName); 
     f = System.Web.Hosting.HostingEnvironment.MapPath(f); 
     if (File.Exists(f)) 
     { 
      if (f != null) File.Delete(f); 
     } 
    } 
} 

Pourquoi cela pourrait se produire?

+0

Cela ressemble à un problème d'autorisations. Les autorisations sont-elles différentes des fichiers que vous pouvez supprimer par rapport à ceux que vous ne pouvez pas supprimer? –

Répondre

2

Si ce n'est pas en lecture seule, il est possible qu'il soit actuellement utilisé par un autre processus.

+2

Pas de réponse, mieux vaut commenter – Kiquenet

+0

@Kiquenet: Pourquoi ce ne serait pas une réponse? C'est en fait ce qui se passait pour moi. Seulement, en fait c'était le processus lui-même qui essayait de le supprimer. (J'avais accidentellement référencé un projet dans mon script de mise à jour.) – teynon

0

Vous, l'utilisateur humain, avez un identifiant avec certains droits. Le serveur Web peut avoir une connexion différente avec des droits différents. Un utilisateur commençant par IUSR_XXXX ou une telle chose. Assurez-vous que l'utilisateur a des droits sur le répertoire.

Sans plus d'informations sur le contexte dans lequel vous supprimez le fichier, je suppose que l'utilisateur du serveur Web a des droits différents sur un fichier que vous.

1

Vérification de l'évidence première ...

Lorsque vous ouvrez la propriété de fichier et jetez un oeil à ses paramètres de sécurité. L'utilisateur qui exécute le code (c'est-à-dire s'il s'agit d'ASP.NET, compte de services réseau/service de domaine) a-t-il accès à la suppression effective du fichier? Si ce n'est pas le cas, modifiez-le et réessayez.

Exécutez-vous en tant qu'administrateur lorsque vous essayez de supprimer manuellement? Si vous êtes, alors c'est probablement pourquoi vous pouvez le supprimer manuellement. Essayez de le supprimer en tant que compte exécutant votre ASP.NET (je suppose que c'est ASP.NET puisque vous utilisez System.Web.Hosting.HostingEnvironment.MapPath.)

Si les deux ont échoué, essayez de voir si d'autres processus utilise actuellement ce fichier. Bon outil pour savoir est SysInternal Process Monitor. Filtrer par chemin contenant votre nom de fichier et vous devriez voir si quelque chose l'utilise. Terminez le processus et réessayez.

+0

+1 pour l'outil sysinternal (jusqu'à présent, je ne savais pas comment utiliser les outils sysinternal) – eKek0

+0

Si vous essayez de supprimer un fichier en cours d'exécution, une exception UnauthorizedAccessException est générée ? Je m'attendrais à un autre type d'exception car ce n'est pas un problème avec les autorisations. –

17

J'ai rencontré le même problème et j'ai constaté que l'écriture de mon propre wrapper Directory.Delete l'a corrigé. Ceci est récursif par défaut:

using System.IO; 

public void DeleteDirectory(string targetDir) 
{ 
    File.SetAttributes(targetDir, FileAttributes.Normal); 

    string[] files = Directory.GetFiles(targetDir); 
    string[] dirs = Directory.GetDirectories(targetDir); 

    foreach (string file in files) 
    { 
     File.SetAttributes(file, FileAttributes.Normal); 
     File.Delete(file); 
    } 

    foreach (string dir in dirs) 
    { 
     DeleteDirectory(dir); 
    } 

    Directory.Delete(targetDir, false); 
} 
+0

Qu'en est-il de http://caioproiete.net/fr/csharp-delete-folder-including-its-sub-folders-and-files-even-if-marked-as-read-only/? – Kiquenet

+0

Je ne suis pas sûr de ce que vous voulez dire? Je vois que c'est une fonction similaire ... mais pas exactement la même chose ... Quand j'ai utilisé ça avant, ça a bien fonctionné ... ça fait un moment maintenant! –

+2

merci, vous avez résolu mon problème –

6

Si le répertoire contient un fichier en lecture seule, il ne le supprimera pas en utilisant Directory.Delete. C'est une mise en œuvre idiote de MS.

Je suis surpris que personne n'ait suggéré cette méthode sur Internet, qui supprime le répertoire sans le parcourir et en changeant les attributs de chaque fichier.Voilà que:

Process.Start("cmd.exe", "/c " + @"rmdir /s/q C:\Test\TestDirectoryContainingReadOnlyFiles"); 

(Changer un peu pour ne pas tirer une fenêtre cmd momentanément, qui est disponible partout sur Internet)

+0

Je ne pense pas que ce soit idiot. Si vous le 'supprimez' manuellement, vous le déplacez vers la Corbeille. –

+1

@DaveVandenEynde dépend, j'utilise généralement shift + del pour supprimer des fichiers de façon permanente. – Nothing4You

+0

Ceci est la solution que je cherchais, Merci – Juran

0

moi aussi face au problème même, mais finalement venu avec une approche générique. Voici mes codes.

Chaîne chemin d'accès = "C: \ Users \ Public \ Documents \ Filepath.txt";

  if (!Directory.Exists(pathfile)) 
      { 
       File.SetAttributes(pathfile, FileAttributes.Normal); 
       File.Delete(pathfile); 
      } 


       using (FileStream fs = File.Create(pathfile)) 
       { 
        Byte[] info = new UTF8Encoding(true).GetBytes("What Ever Your Text is"); 

        fs.Write(info, 0, info.Length); 
        File.SetAttributes(pathfile, FileAttributes.ReadOnly); 

       } 
Questions connexes