如何在Windows XP/Vista上创建临时文件的路径

3
什么是最佳实践方式? tmpnam() 返回一个位于根目录的文件路径,在 Windows Vista 上需要管理员权限,因此这不是一个选项。
5个回答

6

1

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

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

希望这有所帮助,

Martin。


0

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

tmpnam man页面

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函数可在跨平台上使用,但确实存在竞争条件,正如您所提到的man页面所述(http://www.kernel.org/doc/man-pages/online/pages/man3/tmpnam.3.html)。然而,man页面(以及随后您)建议的解决方案在Windows上不可用,而原始问题正是关于Windows的。mktemp可用,但存在类似的竞争条件错误(以及可预测的文件模式)http://msdn.microsoft.com/en-us/library/ms235413(v=vs.80).aspx。 - Zach Burlingame
看起来在Windows上首选的解决方案是使用CRT安全增强函数_mktemp_s,但这在其他平台上不可用,或者使用Windows API调用GetTempFileName,正如接受的答案所述。总之,我认为没有一个无错误的跨平台选项。 - Zach Burlingame

0
你尝试过将环境变量TEMP和TMP设置为所有用户都可写的目录吗? 在XP中更改环境变量(不熟悉Vista),您可以进入系统属性,[高级]选项卡,[环境变量]按钮。

0
或许您可以使用 kernel32.dll 中的 Win32 方法 GetTempPath()。在 .NET 中,通过 System.IO.Path.GetTempFileName() 进行封装。
在 XP 上,它返回 C:\Documents and Settings\用户名\Local Settings\Temp\ 中的路径,因此您不需要管理员权限。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接