2011-10-19 44 views
2

我的C++ winAPI應用程序需要在將文件上傳到服務器之前創建一個臨時文件。所以我搜索了創建臨時文件的方法&發現有很多方法可以做到這一點。創建臨時文件的許多方法:每種方法背後的情況是什麼?

你能告訴我:對於下面的每種方法,我應該在哪種情況下使用該方法?哪種方法最適合我的需求?

方法1:

// Using CreateFile() 
CreateFile("myfile.txt", GENERIC_ALL, ..., FILE_ATTRIBUTE_TEMPORARY, 0); // removed unecessary parameters 

方法2:

// I think that GetTempFileName also creates the file doesn't it? Not just generates a unique fileName? 
// Gets the temp path env string (no guarantee it's a valid path). 
dwRetVal = GetTempPath(MAX_PATH,   // length of the buffer 
         lpTempPathBuffer); // buffer for path 

// Generates a temporary file name. 
uRetVal = GetTempFileName(lpTempPathBuffer, // directory for tmp files 
          TEXT("DEMO"),  // temp file name prefix 
          0,    // create unique name 
          szTempFileName); // buffer for name 

方法3:

// Create a file & use the flag DELETE_ON_CLOSE. So its a temporary file that will delete when the last HANDLE to it closes 
HANDLE h_file = CreateFile(tmpfilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL); 

爲什麼要創建一個臨時文件中,有超過1路。例如,我想在方法1中使用方法2的情況是什麼?

回答

5

FILE_ATTRIBUTE_TEMPORARY只是告訴Windows如果有足夠的緩存,就不用費力地將文件內容寫入磁盤,因爲該文件是臨時的,沒有其他進程會使用它。

FILE_FLAG_DELETE_ON_CLOSE意味着它說什麼 - 當您關閉文件時,它將被自動刪除。這保證它是暫時的。

GetTempFilename爲臨時文件創建名稱,並確保文件名先前未被使用過。

創建臨時文件時應使用全部3種方法。他們中沒有一個干擾其他人。

+1

FILE_ATTRIBUTE_TEMPORARY屬性會導致文件系統在有足夠的高速緩存可用時避免將數據寫回大容量存儲。請參閱http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx#caching_behavior –

+0

@Sergius,感謝您的更正 - 我已將它編輯爲答案。我記得它與緩存有關,但明顯地玷污了細節。順便說一下,很棒的鏈接。 –

0

對於方法#2,如果對「唯一ID」使用0,則實際上需要使用FILE_ATTRIBUTE_TEMPORARY調用SetFileAttributes,以使方法#1爲臨時生成的文件(否則它將是正常的ARCHIVE/NOT_CONTENT_INDEXED文件)。

使用GetFileAttributes或GetFileInformationByHandle查看文件實際擁有的屬性。

相關問題