95 votes

System.IO.IOException : "Le fichier existe" lors de l'utilisation de System.IO.Path.GetTempFileName() - résolutions ?

Un de mes clients a eu une exception à chaque fois qu'il a essayé d'utiliser mon produit. J'ai obtenu le callstack de l'exception qui s'était produite, dont le sommet 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)

En cherchant sur Google, j'ai trouvé beaucoup de articles de blog indiquant que cette exception est levée lorsqu'il y a plus de 65535 fichiers temporaires dans le dossier %TEMP%, et que la solution consiste simplement à effacer les anciens fichiers temporaires. Je peux demander au client de le faire, mais cela pourrait n'être qu'une solution temporaire. Que faire si le client utilise régulièrement un autre logiciel qui fait de fréquents appels à GetTempFileName, ce qui fera réapparaître le problème encore et encore ?

Je ne peux pas simplement effacer par programme le dossier %TEMP%, car cela pourrait endommager quelque chose d'autre, et je ne peux pas éviter d'appeler GetTempFileName (et utiliser mon propre dossier temporaire à la place) car ce n'est pas moi mais le code WPF qui l'appelle.

Existe-t-il une solution permanente à ce problème ?

UPDATE : J'ai confirmé que le problème où le dossier %TEMP% déborde de fichiers journaux n'est pas causé par mon propre code, et doit être causé par une autre application tierce sur la machine du client. J'ai également examiné l'implémentation de Cursor.LoadFromStream et il n'est sûrement pas en cause - il génère un fichier temporaire, mais le supprime ensuite en finally bloc.

2voto

volody Points 3400
// one more implementation
string GetTempFileName()
{
    return Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
}

1voto

Ed Chapel Points 5038

En Sayse suggéré, vous pouvez essayer de définir la variable d'environnement %TEMP% au lancement de votre application.

Environment.SetEnvironmentVariable("TEMP", "<dir>");

0voto

Aman Sidhu Points 1

Définissez explicitement l'attribut de fichier comme temporaire, et assurez-vous de supprimer le fichier après utilisation.

 File.SetAttributes(tempFileName, FileAttributes.Temporary);

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