Système.IO.IOException: “Le fichier existe” lors de l'utilisation du Système.IO.Chemin d'accès.GetTempFileName() - résolutions?
L'un de mes clients a eu une exception quand il a essayé d'utiliser mon produit. J'ai obtenu la pile des appels de l'exception qui ont eu lieu, dont la partie supérieure est:
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.__Error.WinIOError()
at System.IO.Path.GetTempFileName()
at System.Windows.Input.Cursor.LoadFromStream(Stream cursorStream)
at System.Windows.Input.Cursor..ctor(Stream cursorStream)
Googler cela, j'ai trouvé beaucoup de billets de blog indiquant cette exception est levée lorsqu'il y a plus de 65535 fichiers temporaires dans le dossier %TEMP%, et que la solution est de simplement effacer les anciens fichiers temporaires. Je peux demander au client de le faire, mais ce peut n'être qu'une solution temporaire, ce qui si elles sont régulièrement de course de quelque autre morceau de logiciel qui permet de fréquents appels à GetTempFileName, ce qui rend le problème se reproduira plus et plus?
Je ne peux pas juste par programme effacer le dossier %TEMP%, qui peut en quelque sorte des dommages de quelque chose d'autre, et je ne peux pas éviter d'appeler GetTempFileName (et l'aide de mon propre dossier temp au lieu de cela) que ce n'est pas moi, mais le code WPF c'est en l'appelant.
Est-il une solution permanente à ce problème?
Mise à JOUR: j'ai confirmé que le problème où le dossier %TEMP% déborde les fichiers de log n'est pas causé par mon propre code, et doit être causé par une autre application 3ème partie sur la machine du client. J'ai aussi regardé dans la mise en œuvre de Cursor.LoadFromStream
et il n'est sûrement pas la faute - il génère un fichier temp, mais supprime ensuite dans finally
bloc.
- Vous pourriez faire votre propre dossier "Temp" qui est supprimé (dans application data") mais probablement être un ballache modifier toutes les références, bonne question
- La question n'est pas liée à WPF, supprimé la balise. Aussi, pourquoi ne pas simplement corriger le code, qui produit aussi de nombreux fichiers temporaires sans suppression?
- Je ne peux pas le faire parce que c'est WPF
Cursor.LoadFromStream
c'est de générer le fichier temp. @Dennis C'est lié à WPFCursor.LoadFromStream
classe. Le code malveillant qui produit alors de nombreux fichiers temporaires sans suppression pourrait même ne pas être le mien, et j'avais encore besoin de l'adresse de l'exception. - Pouvez-vous savoir quelle application est en laissant derrière tous ces fichiers temporaires? C'est votre demande? Si WPF est la création de ces fichiers temp elle-même, avez-vous vérifié qu'il est de les supprimer quand ils ne sont plus nécessaires?
- Je pense que votre seule option est alors de try/catch de l'OIE, et de demander à l'utilisateur s'il veut que vous supprimer les fichiers temporaires et essayez à nouveau
- C'est un problème plus général que " la fixation de votre code, j'ai remarqué un comportement similaire avec le Poulpe déployer 3.1.3 qui ne parvient pas à nettoyer après lui-même. J'ai pour supprimer manuellement les fichiers temporaires du dossier pour la même raison.
Vous devez vous connecter pour publier un commentaire.
Comme je l'ai mentionné dans mon dernier commentaire, je pense que votre seule façon de le faire est de demander à l'utilisateur s'il veut que vous supprimez des fichiers et essayez de nouveau. Il est impératif que vous obtenez les utilisateurs d'entrée de cette, de cette façon, c'est à leurs risques et périls. Dans ma tête de ses quelque chose de similaire.
Une option assurez-vous que pourrait être,
"*"
trouverez tous les fichiers (peu importe si elles ont une extension ou pas) j'espère que ça aideSi cela vous arrive sur un environnement de production ou avec une application que vous ne pouvez pas changer, la solution est de vider le dossier Temp.
En fonction de l'utilisateur qui exécute l'application, vous devez soit
C:\Windows\Temp
(pour IIS ou services en cours d'exécution en vertu de l'LocalSystem
compte)%temp%
pour localement des utilisateurs connectés (qui pour moi estC:\Users\MyUserName\AppData\Local\Temp
).De l'autre côté, si votre code est à jeter, et que vous voulez empêcher que cela n'arrive jamais:
GetTempFileName()
est un wrapper de la plus de deux décennies de l'Api Win32. Générer des noms de fichiers qui sera très facilement entrer en collision. Il contourne ces collitions lourdement en boucle sur le système de fichiers, le parcours possible des noms de fichier de"%temp%\tmp0000.tmp"
à"tmpFFFF.tmp"
et le saut de celles qui existent déjà. C'est une e/S intensives, lent, et franchement terrible algorithme. Aussi à l'aide de seulement 4 caractères hexadécimaux est ce qui fait la limite artificielle de 65536 fichiers avant d'échouer.L'alternative est de générer des noms de fichiers qui ne seront pas entrer en collision. Par exemple, vous permet de réutiliser
GUID's
logique: 32 chiffres hexadécimaux ne sera presque jamais en collision.Ceci augmente la limite de 65 k 4k millions de fichiers max (en théorie)... bien sûr, avoir coulé 65k fichiers est déjà terrible, donc...
Vérifiez votre application pour tous les heureux et les malheureux chemins (comme des exceptions inattendues). S'assurer qu'il est correctement disposer chaque FileStream et de supprimer les fichiers temporaires Enfin blocs .
Nettoyer maintenant et pour les sensibiliser à l'administrateur système de la nettoyer régulièrement, parce que vous ne pouvez pas faire confiance toutes les applications dans la nature.
Sur mon propre serveur, je voudrais automatiser cette tâche à l'aide de:
schtasks /Create /TR "cmd /c call DEL /F /S /Q %^TEMP%" /TN "Delete Global Temp Files" /sc WEEKLY /ST 12:00 /ru system
schtasks /Create /TR "cmd /c call DEL /F /S /Q %^TEMP%" /TN "Delete %username% Temp Files" /sc WEEKLY /ST 12:00
Voici le code que j'ai utilisé dans la fin, et de le mettre dans mes premières années d'application du code d'initialisation de chemin, avant tout appel à
Cursor.LoadFromStream
peut se produire:Solutions:
moniteur de Processus
devrait vous aider. Ensuite corriger la demande ou de le jeter. Et oui, ce pourrait être votre application. c'est pourquoi je vous recommande de détecter la source du mal.Comme Sayse suggéré, vous pouvez essayer le réglage de la variable d'environnement %TEMP lorsque votre application est lancée.
what if they are regularly running some other piece of software that makes frequent calls to GetTempFileName
.Pour quelqu'un d'autre qui a rencontré ce problème et ne peut pas trouver tout débordement temp-dossier -
Cochez la case "C:/Windows/Temp"-dossier. Le nettoyage de ce dossier résolu mes problèmes.