ALLINSIGHT

Home of the AlmostImplementedException

Einschränkung von Path.GetTempFileName

Willkommen zu einem kurzen Abstecher zu einer konkreten Funktion des .Net Frameworks: Path.GetTempFileName
In meinem aktuellen Projekt haben wir sehr viele Unit Tests -in denen sehr viele temporäre Dateien (erzeugt durch Path.GetTempFileName) benutzt werden – und einen Build Server, der die Projekte buildet und die entsprechenden Tests ausführt.
Vor einigen Wochen haben wir bemerkt, dass der Build Server plötzlich viel mehr Zeit benötigt, um einen Build inkl. Tests abzuschließen und zusätzlich eine sehr hohe CPU-Auslastung hat.
Wir fanden raus, dass das Problem durch die temporären Dateien verursacht werden. Nach einigen Nachforschungen im Temp-Order haben wir entdeckt, dass dort ca. 65k Dateien mit Namen wie “”tmp0F45.tmp” vorhanden waren.
Also haben wir den Ordner geleert und einen neuen Build gestartet. Und siehe da – Alles lief wieder wie gewünscht.
Das Problem wurde – wie erwartet – durch die temporären Dateien verursacht, welche mit Path.GetTempFileName erstellt wurde. Aber warum? Wenn wir uns die Dateinamen näher anschauen, werden wir feststellen, dass diese 4 hex Ziffern enthalten – Damit hätten wir einen Bereich von 0x0000 bis 0xFFFF (0 – 65535). Dies ist ebenfalls in der MSDN Dokumentation über die Path.GetTempFileName Funktion beschrieben (MSDN: Path.GetTempFileName)

Die GetTempFileName-Methode löst eine IOException aus, wenn sie für die Erstellung von über 65535 Dateien verwendet wurde, ohne dass die vorherigen temporären Dateien gelöscht wurden.

Ihr könnt das Verhalten mit dem folgenden Snippet nachvollziehen:

Achtung: Denkt daran, dass dadurch tausende von temporären Dateien in eurem Temp-Verzeichnis erstellt werden. Benutzt das folgende in einer Console um die erzeugten Dateien zu löschen: “DEL %TEMP%\tmp????.tmp”
Auf meinem System steigt die Zeit für die Erstellung nach ca. 47k Dateien von ~0,4s auf ~2,8s. Das letzte Paket von 1024 Dateien brauch noch länger und die letzte Dateie verursacht eine IOException. Also vergesst nicht die temporären Dateien zu bereinigen oder benutzt eine eigene Logik um temporäre Dateien zu erzeugen, z.B. eine Guid als Dateiname.

Share :

, , , , , , , , ,

Leave a Reply