【问题标题】:Many ways to create a Temporary file: what is the situation behind each method?创建临时文件的多种方法:每种方法背后的情况如何?
【发布时间】:2011-10-19 04:44:48
【问题描述】:

我的 C++ winAPI 应用程序需要在将文件上传到服务器之前创建一个临时文件。所以我搜索了创建临时文件的方法,发现有很多方法可以做到这一点。

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

方法一:

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

方法二:

// 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 

方法三:

// 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?

【问题讨论】:

    标签: c++ winapi temporary-files


    【解决方案1】:

    FILE_ATTRIBUTE_TEMPORARY 只是告诉 Windows 如果有足够的缓存就不要费心将文件内容写入磁盘,因为该文件是临时的,没有其他进程会使用它。

    FILE_FLAG_DELETE_ON_CLOSE 就是它所说的 - 当你关闭文件时,它会被自动删除。这保证它是临时的。

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

    在创建临时文件时,您应该使用所有 3 种方法。他们都不会干扰其他人。

    【讨论】:

    • FILE_ATTRIBUTE_TEMPORARY 属性会导致文件系统在有足够的高速缓存可用时避免将数据写回大容量存储。见msdn.microsoft.com/en-us/library/windows/desktop/…
    • @Sergius,感谢您的更正-我已将其编辑为答案。我记得它与缓存有关,但显然把细节搞砸了。顺便说一句,链接很好。
    【解决方案2】:

    对于方法 #2,如果您将 0 用于“唯一 ID”,您实际上需要使用 FILE_ATTRIBUTE_TEMPORARY 调用 SetFileAttributes 以使生成的文件在与方法 #1 相同的意义上成为临时文件(否则它将是一个普通的 ARCHIVE/NOT_CONTENT_INDEXED 文件.)

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

    【讨论】:

      猜你喜欢
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      相关资源
      最近更新 更多