方案中的安裝專案建置起來會出現IOException例外,且某專案在程式中建立PerformanceCounterCategory也會出現IOException,更奇怪的是IOException的描述竟然是The file exists,到底是什麼樣的檔案已經存在了,我又不是在做檔案儲存動作。
其實可以注意一下上面提到的範例,我們可以看到temp file的命名規則是tmp1.tmp~tmoFFFF.tmp,猜測這就是這邊會限制為65535的原因。有興趣的可以在建置出65535個暫存檔後,在tmp1.tmp~tmoFFFF.tmp裡面找個檔案刪除,再次運行程式測試,就會發現本來會例外的程式就正常了。
以筆者個人來說是不太難接受這個限制理由,既然不是受限於作業系統內資料夾可存放的檔案數,因為其實作的演算法這樣去限制temp file的數量感覺就有些奇怪,而且既然是產生tmp1.tmp~tmoFFFF.tmp,演算法上應該是循序去找是不是有存在的檔案,因此直覺可能暫存檔的多寡會對效能造成影響,這邊用個簡單的程式碼片段來測試這樣的狀況:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;
namespace ConsoleApplication9
{
class Program
{
static void Main(string[] args)
{
var sw = new Stopwatch();
for (int i = 1; i <= 65536; ++i)
{
sw.Start();
Console.WriteLine(String.Format("{0} {1}",
Path.GetTempFileName(),
sw.ElapsedMilliseconds.ToString()));
sw.Stop();
sw.Reset();
}
}
}
}
這邊筆者只是將此問題做個簡單的整理,希望開發人員以後碰到這樣的問題不要再被它搞到。GetTempFileName那段程式不一定是自己寫的,但使用某些元件或是團隊合作中都可能都會間接的碰到這樣的問題,所以對此問題的症狀要有些印象,另外還有就是在使用GetTempFileName時最好在不用時記得要把暫存檔案給刪掉。