在Windows (win7 64-bit)上運行Doxygen的時候,總是遇到這個錯誤,困擾了我好久。
這次把Doxygen的原始碼下載回來, 在Windows 7上成功編譯(詳情看這裡),想看看究竟發生了什麼。
在Visual C++ 2008 Express Edition裡debug, 發現是在Doxygen源碼 (.\qtools\qfile_win32.cpp) 中定義的 bool QFile::open( int m ) 函數內,調用 _wfopen() 建立.html檔案的時候,返回的指標為NULL.
跟蹤到這裡以後,折騰了好久也沒有找到原因 - 函數的調用沒有問題、硬碟的空間也足夠、把Doxygen報錯的源檔案單獨用Doxygen解析也沒有問題。
就在無比迷茫之際,我在Doxygen的輸出目錄下,試圖手工建立檔案(Doxygen代碼建立失敗的檔案)的時候,看到了下面的錯誤 (0x80070052)。
這讓我看到了一些端倪。 經過google,Baidu和Bing了一通關鍵字"0x80070052"之後,開始懷疑Windows上一個目錄下允許建立的檔案個數可能有上限。
於是寫了幾行Python,往一個指定目錄下迴圈寫檔案,測試的結果驗證了我的猜想 - Windows (FAT32檔案系統)一個目錄下可以建立的檔案個數是有上限的,而且這個上限和檔案名稱的長度有關。
我測試的結果是,在FAT32檔案系統裡,一個目錄下, 如果檔案名稱長度為50個字元(包括 . 和 副檔名),檔案數最大為 13106; 如果檔案名稱長度為100, 檔案數最大為7281。
(順便說一下,我是在Win7 64-bit下面使用truecrypt 建立了虛擬FAT32分區, Doxygen的輸出是在這個分區上。)
一個目錄下支援的最大檔案數NTFS檔案系統要比FAT32要大。 於是我立即做了一個測試,把Doxygen的輸出位置指向我電腦上的NTFS分區,果然錯誤消失了。。。
小結一下:
- Windows一個目錄下可以建立的檔案數是有上限的,而且檔案名稱越長,檔案數上限越小;
- NTFS檔案系統支援的最大檔案數比FAT32大;