Comment fermer un fichier qui est déjà ouvert dans un répertoire
Je suis en train d'analyser un dossier et supprimer tous les fichiers qu'il contient.
DirectoryInfo dir = new DirectoryInfo("C\\Temp");
if (dir.GetDirectories().Any(p => p.Name == "\\NewTemp"))
{
foreach (string file in Directory.GetFiles(dir + "\\NewTemp"))
{
File.SetAttributes(file, FileAttributes.Normal);
File.Delete(file);
}
}
Ce code fonctionne très bien et supprime tous les fichiers dans mon \NewTemp Dossier. Mais si l'un des fichiers est ouvert ces fichiers ne seront pas supprimés. Je veux forecfully fermer les fichiers ouverts et les supprimer. J'ai même essayé de
foreach (string file in Directory.GetFiles(dir + "\\NewTemp"))
{
TextReader tr = new StreamReader(dir+"\\NewTemp\\"+file);
tr.Close();
File.SetAttributes(file, FileAttributes.Normal);
File.Delete(file);
}
Mais pas d'utilisation. S'il vous plaît laissez-moi savoir où je suis absent.
qu'est-ce que
Je suis assez sûr il y a aussi cet utilitaire de ligne de commande que vous pouvez utiliser pour obtenir tous les processus qui ont un fichier ouvert, et je suis aussi assez sûr que vous pouvez taskkill ces processus à partir de c#
tr essaie de fermer le fichier TextReader tr = new StreamReader(fichier). J'ai fait une faute de frappe
stackoverflow.com/questions/177146/... Il n'est pas trop simple avec le code managé. Dans cette réponse, il y a un lien vers un proget sur Codeproject qui peuvent vous aider.
tr
doin ilJe suis assez sûr il y a aussi cet utilitaire de ligne de commande que vous pouvez utiliser pour obtenir tous les processus qui ont un fichier ouvert, et je suis aussi assez sûr que vous pouvez taskkill ces processus à partir de c#
tr essaie de fermer le fichier TextReader tr = new StreamReader(fichier). J'ai fait une faute de frappe
stackoverflow.com/questions/177146/... Il n'est pas trop simple avec le code managé. Dans cette réponse, il y a un lien vers un proget sur Codeproject qui peuvent vous aider.
OriginalL'auteur Sneha S Murthy | 2012-10-04
Vous devez vous connecter pour publier un commentaire.
Eh bien, vous êtes de clôture votre poignée sur le fichier - mais cela ne va pas affecter n'importe quel autres descripteurs de fichiers, qu'ils soient détenus par votre processus ou non. Fondamentalement, vous ne pouvez pas supprimer un fichier qui est en cours d'utilisation ailleurs, sauf s'ils ont été explicitement ouvert avec un partage de fichiers drapeau qui lui permet d'être supprimé. C'est juste la façon dont les systèmes de fichiers Windows de travail, pour autant que je sais. (EDIT: j'ai d'abord proposé d'utiliser le bloc-notes comme un moyen de garder un descripteur de fichier ouvert, mais apparemment, il ferme le handle après le chargement dans la mémoire. Euh, essayez d'autres apps 🙂
Je crois que vous pouvez forcer la fermeture de descripteurs de fichiers (n'importe quel descripteur de fichier), j'ai utilisé des programmes qui le font. Je ne pense pas qu'il y a de tout .Net des fonctions pour le faire, alors vous pourriez avoir à creuser dans l'API windows pour une réponse.
C'est en fait un mauvais exemple. Le bloc-notes lit le fichier et puis le referme. Vous pouvez supprimer les fichiers ouverts avec le bloc-notes, sans fermer le bloc-notes de la première.
Le bloc-notes exemple était incorrecte. Le bloc-notes permet de ne pas garder la poignée ouverte. Il charge tout le texte dans la mémoire et les communiqués de la poignée. Vous pouvez supprimer le fichier, même si le bloc-notes est ouvert.
C'est un très tâche non triviale. Vous avez besoin d'obtenir en quelque sorte le processus qui détiennent une poignée pour le fichier et de le rendre ces processus étroite que la poignée. Il n'existe pas de WinAPI de la fonction pour cela.
OriginalL'auteur Jon Skeet
Vous ne pouvez pas supprimer un fichier si la poignée est ouvert par un autre processus. Vous devrez tuer les processus avant de supprimer le fichier.
Vous pouvez regarder ce exemple pour voir comment trouver tous les descripteurs ouverts.
OriginalL'auteur loopedcode
C'est un outil pratique pour trouver le processus qui a les descripteurs de fichiers:
http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
OriginalL'auteur Justin Harvey
Si vous savez ce programme a votre fichier ouvert, vous pouvez juste taskkill que le programme directement, et puis supprimez votre fichier.
Si vous ne savez pas ce processus a votre ouverture de fichier, que vous pouvez utiliser un utilitaire comme ceci, puis traiter la sortie. Je me rediriger la sortie et ensuite utiliser les regex pour trouver ce processus que je veux obtenir, mais il y a probablement une meilleure solution.
Garder à l'esprit que cette méthode n'est pas entièrement sûr, et peut tuer les processus qui vous vol pas envie de tuer.
OriginalL'auteur Sam I am
Ce sont vos options, dans l'ordre dans lequel vous devez les essayer (de la moins invasive pour très envahissantes).
FILE_FLAG_DELETE_ON_CLOSE
drapeau (pinvoke à CreateFile). Quand tous les autres poignées, les fichiers sont fermés le système supprimera le fichier pour vous.FILE_SHARE_DELETE
, alors vous devriez appeler MoveFileEx avec leMOVEFILE_DELAY_UNTIL_REBOOT
drapeau (et le lpNewFileName paramètre à NULL /IntPtr.Zéro). Cela va entraîner le fichier à supprimer au prochain redémarrage du système.OriginalL'auteur josh poley
OriginalL'auteur aditi mandloi