9 votes

File.Delete L'accès au chemin est refusé

Le programme de mon application console crée des fichiers d'exécution pendant qu'il fonctionne. Je veux donc supprimer tous ces fichiers au démarrage de l'application. J'ai essayé ceci :

public static void Empty(string targetDir)
{
    var directory = new DirectoryInfo(targetDir);
    if (!directory.Exists) return;
    foreach (var file in directory.GetFiles()) file.Delete();
    foreach (var subDirectory in directory.GetDirectories()) subDirectory.Delete(true);
}

...juste pour rechercher tous les fichiers/dossiers dans le chemin donné (qui est dans un sous-répertoire dans le chemin d'exécution du programme) puis les supprimer. Cependant, j'obtiens l'exception suivante :

L'accès au chemin 'file' est refusé.

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

Notes :

  1. Le fichier n'est pas exécuté dans une autre application.
  2. Le fichier ne se trouve pas dans un dossier protégé.
  3. Le fichier peut être supprimé manuellement sans problème et c'est pourquoi j'ai suis ici.

8voto

bamie9l Points 570

J'ai eu cette erreur et j'ai découvert que c'était parce que mes fichiers de test étaient en lecture seule. J'ai changé cela et je peux maintenant utiliser fileinfo pour les supprimer sans problème.

4voto

EdmundYeung99 Points 759

Vous dites que les fichiers ne sont pas ouverts dans une autre application, mais ils doivent être ouverts dans votre application :

//Create some directories to delete
Directory.CreateDirectory("C:/Temp/DeleteMe");
Directory.CreateDirectory("C:/Temp/DeleteMe/DeleteMe");
File.Create("C:/Temp/DeleteMe/DeleteMeFile");//FileStream still open!!

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

Assurez-vous que vous disposez du flux de fichiers lorsque vous créez le fichier.

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

4voto

roderickprince Points 201
if (File.Exists(filePath))
{
    File.SetAttributes(filePath, FileAttributes.Normal);
    File.Delete(filePath);
}

2voto

L'utilisation de l'API Windows MoveFileEx pourrait être une solution potentielle avec un paramètre MOVEFILE_DELAY_UNTIL_REBOOT pour supprimer le fichier uniquement après le redémarrage.

Veuillez vérifier http://msdn.microsoft.com/en-us/library/aa365240%28v=vs.85%29.aspx .

1voto

sa_ddam213 Points 18735

Essayez d'utiliser le Microsoft.VisualBasic.FileIO.FileSystem car il dispose d'une méthode pratique DeleteDirectory méthode, j'ai eu des problèmes d'accès il y a quelques temps et ceci a été la solution à mon problème.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X