2012-06-23 90 views
0

通過多次加載DLL來模擬多線程(專爲此設計)。由於LoadLibrary()並不真的允許它,DLL通過GetTempPath()GetTempFileName()將自己複製到一個臨時文件中。Windows上的臨時文件和文件夾

這是一個小文件,並在線程銷燬後釋放庫並刪除臨時文件。現在的問題是線程的數量是可配置的(瘋子可以選擇50,100,更多),這基本上暴露了運行不穩定,崩潰的風險,而不是通過通常的「刪除臨時文件」例程。

如果我只是讓那些臨時文件死在那裏,可以嗎?操作系統通常會自行清理嗎?或者我應該寫一個autocleanup例程?如果是的話,我怎麼能保存另一個臨時文件來保存這些文件的列表,而不是打UAC限制或其他?

任何想法?

回答

4

您的LoadLibrary /多線程討論讓我感到困惑,但沒關係。

Windows上的臨時文件通常不會被創建它們的進程以外的任何東西刪除。如果用戶運行「磁盤清理」util或類似工具,他可能會自動刪除這些文件。我不認爲這經常發生。

最佳方法。讓您的應用程序在臨時文件夾中創建一個子目錄(可能還有每個流程實例的子文件夾)。當您退出應用程序時,它會通過DeleteFile清理它自己的一組臨時文件。在應用程序重新啓動時,它可以有一些邏輯來清理由於先前的進程崩潰而仍然徘徊的文件夾和文件。

你也可以看看在CreateFile上使用FILE_ATTRIBUTE_TEMPORARY標誌。

你也可以考慮爲你的進程設置一個全局異常處理程序。處理程序會在崩潰退出之前刪除它自己的臨時目錄。

+0

全局異常處理程序是否也解釋了進程被另一個進程顯式終止的情況?你能提供更多信息嗎?好的提示在子目錄順便說一句。 –

1

您可以使用FILE_FLAG_DELETE_ON_CLOSE參數CreateFile嗎?

+0

似乎與'LoadLibrary()'相沖突; 'CreateFile() - > LoadLibrary()'得到共享衝突。 LoadLibrary() - > CreateFile()會使程序崩潰。 'CreateFile() - > CloseHandle() - > LoadLibrary()'加載失敗,因爲文件被提前刪除。 –

+0

共享衝突可能是因爲未在CreateFile參數sharemode(第三個參數)中指定FILE_SHARE_DELETE。無論何時打開文件,都要爲CreateFile提供相同的參數。 hfile = CreateFile(L「filename.txt」,GENERIC_READ | GENERIC_WRITE | DELETE,FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,...) – RoyalJai

+0

不,它仍然不允許LoadLibrary執行它的操作。如果我切換順序並傳遞'OPEN_EXISTING'而不是'CREATE_ALWAYS',它可以工作,除非它允許文件存在,即使在所有句柄關閉之後。 –