创建临时文件的多种方法:每种方法背后的情况是什么? 我的C++ WiLAPI应用程序需要在上传文件到服务器之前创建一个临时文件。所以我搜索了创建临时文件的方法&发现有很多方法可以做到这一点

创建临时文件的多种方法:每种方法背后的情况是什么? 我的C++ WiLAPI应用程序需要在上传文件到服务器之前创建一个临时文件。所以我搜索了创建临时文件的方法&发现有很多方法可以做到这一点,c++,winapi,temporary-files,C++,Winapi,Temporary Files,您能告诉我:对于以下每种方法,我应该在哪种情况下使用该方法?哪种方法最适合我的需要 方法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? No

您能告诉我:对于以下每种方法,我应该在哪种情况下使用该方法?哪种方法最适合我的需要

方法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 ); 

为什么创建临时文件的方法不止一种。例如,我想在什么情况下使用方法2而不是方法1?

FILE\u ATTRIBUTE\u TEMPORARY
只是告诉Windows如果有足够的缓存,不要麻烦将文件内容写入磁盘,因为文件是临时的,没有其他进程会使用它

FILE\u FLAG\u DELETE\u ON\u CLOSE
的意思就是它所说的-当你关闭文件时,它将被自动删除。这保证了它将是暂时的

GetTempFilename
为临时文件创建一个名称,并保证该文件名以前未被使用过

创建临时文件时,应使用所有3种方法。对于方法2,如果您使用0作为“唯一ID”,您实际上需要使用FILE#u ATTRIBUTE_TEMPORARY调用SetFileAttributes,以使生成的文件在与方法1相同的意义上成为临时文件(否则它将是普通存档/非内容索引文件)


使用GetFileAttributes或GetFileInformationByHandle查看文件实际拥有哪些属性。

file\u ATTRIBUTE\u临时属性使文件系统避免在有足够缓存的情况下将数据写回大容量存储。请看@Sergius,谢谢您的更正-我已将其编辑成答案。我记得这和缓存有关,但显然是把细节搞糟了。顺便说一句,链接不错。