7
votes

Fichier.Delete accès au chemin est refusé

Mon programme d'application de la console crée des fichiers d'exécution lorsqu'il fonctionne donc ce que je veux faire est de supprimer tous ces fichiers sur le démarrage de l'application. J'ai essayé ceci: xxx

... Juste pour rechercher tous les fichiers / dossiers du chemin donné (qui se trouve dans un sous-répertoire dans le chemin d'exécution du programme), puis supprimez-les. Cependant, je reçois l'exception suivante:

accès au chemin "fichier" est refusé.

J'ai essayé d'exécuter le programme en tant qu'administrateur sans chance; Cependant, je veux une solution qui fonctionne sans utiliser de privilèges d'administrateur.

Notes:

  1. Le fichier ne fonctionne pas dans une autre application.
  2. Le fichier n'est pas dans un dossier protégé.
  3. Le fichier peut être supprimé manuellement sans problèmes et c'est pourquoi je suis ici.

15 commentaires

Un doute: vous supprimez vraiment tous les fichiers du chemin de candidature?


Je veux juste dire que parce que votre programme est également un fichier.


OFC Non, les fichiers que je supprime sont dans un sous-répertoire situé dans le chemin de l'application.


Quelle est la valeur réelle que le message d'erreur donne? Vous avez substitué 'fichier' là ..


Oui, voir lequel est plaint, qui devrait être facile à tracer - il pourrait y avoir quelques choses. Essayez également de supprimer ce fichier manuellement, etc. Vous avez un cas très clair pour le débogage


Chargez-vous des dll ou utilisez des flux?


Il est supprimé manuellement sans probs.


Juste une hypothèse, pouvez-vous créer une liste de fichiers en dehors de la parcours et de la boucle?


@Vladl: Je n'obtiens pas ce que tu veux dire.


FichierInfo [] fi = répertoire.getfiles (); foreach (var fichier in fi) fichier.delete (); et même pour le répertoire. Peut-être que l'énumarator provoque le problème


@Vladl: Exception ne concerne pas les collections, c'est / o


@Xaqron vraiment? : D En fait, ce que je suppose, c'est que GetFiles () renvoie iEnumerable, créé par retour donné, ce qui pourrait causer des problèmes si un ou plusieurs fichiers sont manquants après la première sortie


@Vladl vous envisagez de "InvalidOperationException - la collection a été modifiée" mais dans ce cas, il existe un "accès refusé"


Réponse alternative: Stackoverflow.com/a/648055/3543437


Duplicailler possible de Comment puis-je supprimer un Répertoire avec des fichiers en lecture seule en C #?


5 Réponses :


2
votes

Utilisation de Windows API MoveFileEx peut être une solution potentielle avec un paramètre mobilefile_delay_until_reboot pour supprimer le fichier seulement après le redémarrage.

Veuillez vérifier http: // msdn. Microsoft.com/en-us/Library/AA365240%28V=VS.85%29.aspx .


1 commentaires

Finalement, le moyen le plus simple serait d'appeler le code natif, de C #. Une recherche rapide montre un bel exemple qui vous encouragera certainement: Stackoverflow.com/Questtions/6077869/...



1
votes

Essayez d'utiliser le Microsoft.visualbase.fileio.filesystem Code> car il a une méthode pratique deleteDirectory code>, j'ai eu accès aux problèmes il y a quelque temps et c'était la solution pour mon problème .

var directory = new DirectoryInfo(targetDir);
if (directory.Exists)
{
    Microsoft.VisualBasic.FileIO.FileSystem.DeleteDirectory(targetDir, Microsoft.VisualBasic.FileIO.DeleteDirectoryOption.DeleteAllContents);
}


4 commentaires

EHM est-ce qu'il existe dans .NET 2?


D'abord, je pense que c'est un code de base visuel aussi, je ne trouve pas cela dans .NET 2


MSDN.MicRosoft .com / fr-nous / bibliothèque / ...


Vous devrez ajouter la référence microsoft.visualbasic



4
votes

Vous dites que les fichiers ne sont pas ouverts dans une autre application, mais il doit être ouvert dans votre application: xxx pré>

Assurez-vous de disposer du flux de fichiers lorsque vous créez le fichier P. >

//Create some directories to delete
Directory.CreateDirectory("C:/Temp/DeleteMe");
Directory.CreateDirectory("C:/Temp/DeleteMe/DeleteMe");
using (File.Create("C:/Temp/DeleteMe/DeleteMeFile")) { }

//Delete the files
var directory = new DirectoryInfo("C:/Temp/DeleteMe");
if (!directory.Exists) return;
foreach (FileInfo file in directory.GetFiles())
{
    file.Delete();
}
foreach (DirectoryInfo dir in directory.GetDirectories())
{
    dir.Delete(true);
}


0 commentaires

8
votes

J'ai reçu cette erreur et j'ai constaté que c'était parce que mes fichiers de test étaient réadis. Changé ceci et je peux maintenant utiliser FileInfo pour les supprimer sans soucis.


0 commentaires

4
votes
if (File.Exists(filePath))
{
    File.SetAttributes(filePath, FileAttributes.Normal);
    File.Delete(filePath);
}

1 commentaires

Bien que cela puisse répondre à la question, veuillez également ajouter une courte explication de votre code et pourquoi il résout le problème initial.