【问题标题】:How to create a path to a temporary file on Windows XP/Vista如何在 Windows XP/Vista 上创建临时文件的路径
【发布时间】:2008-09-18 08:46:13
【问题描述】:

这样做的最佳方法是什么? tmpnam() 返回驱动器根目录中文件的路径,这需要 Windows Vista 上的管理员权限,所以这不是一个选项。

【问题讨论】:

    标签: windows windows-vista temporary-files


    【解决方案1】:

    GetTempPathGetTempFileName 应该可以工作。

    【讨论】:

      【解决方案2】:

      Windows 上的环境变量 %TEMP% 指向用户临时目录。

      在托管 C++ 中,您可以调用 Path::GetTempFileName(),它会在用户临时目录中为您提供一个临时文件(可以使用 Path::GetTempPath() 找到)。 GetTempFileName() 基本上只是为您提供 %TEMP% 路径中的文件的路径,使用 GUID 作为文件名。然后,您使用该路径来创建文件并使用它做您想做的事情。您可以使用任何可以访问当前进程环境变量的语言来执行类似的逻辑。

      希望对你有帮助,

      马丁。

      【讨论】:

        【解决方案3】:

        您是否尝试过将环境变量 TEMP 和 TMP 设置为所有人可写的目录? 要在 XP 中更改环境变量(不熟悉 Vista),请转到系统属性,[高级]选项卡,[环境变量]按钮。

        【讨论】:

          【解决方案4】:

          也许您可以在 kernel32.dll 中使用 Win32 方法 GetTempPath()。这是由 System.IO.Path.GetTempFileName() 封装在 .NET 中的。

          在 XP 上,这会返回 C:\Documents and Settings\username\Local Settings\Temp\ 中的路径,因此您不需要管理员权限。

          【讨论】:

            【解决方案5】:

            如果您关心互操作性,tmpnam 的手册页建议:

            tmpnam 手册页

            BUGS
                   Never use this function. Use mkstemp(3) instead.
            

            mkstemp 手册页

            SYNOPSIS
                   #include <stdlib.h>
            
                   int mkstemp(char *template);
            
            DESCRIPTION
                   The mkstemp() function generates a unique temporary file name from template.  The last six characters of template must be
                   XXXXXX and these are replaced with a string that makes the filename unique. The file is then created with mode read/write
            

            但所有这些都表明您已经准备好了以 TMP 环境变量内容为前缀的模板。

            【讨论】:

            • tmpnam 函数可跨平台使用,并且确实会遇到竞争条件,因为您引用的手册页状态 (kernel.org/doc/man-pages/online/pages/man3/tmpnam.3.html) 但是,手册页(以及随后您)拥有的解决方案建议在 Windows 上不可用,原来的问题是关于的。 mktemp 可用,但存在类似的竞争条件错误(以及可预测的文件模式)msdn.microsoft.com/en-us/library/ms235413(v=vs.80).aspx
            • 看起来 Windows 上的首选解决方案是使用 CRT 安全增强功能 _mktemp_s,这在其他平台上不可用,或者使用 Windows API 调用 GetTempFileName,如接受的答案所述。归根结底,我认为没有一个没有错误的跨平台选项。
            猜你喜欢
            • 2021-03-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-14
            相关资源
            最近更新 更多