如何获取当前用户的临时文件夹
如何获取当前用户的临时文件夹
目前我正在使用以下函数来获取当前用户的临时文件夹路径:\n
string tempPath = System.IO.Path.GetTempPath();
\n在某些机器上,它会给我当前用户的临时文件夹路径,如下所示:\n
\nC:\\Documents and Settings\\administrator\\Local Settings\\Temp\\\n
\n在某些机器上,它会给我系统临时文件夹路径,如下所示:\n
\nC:\\Windows\\TEMP\n
\nMSDN文档还表示,上述API返回当前系统的临时文件夹。\n是否有其他可用的API可以给我类似以下的当前用户临时文件夹路径:\n
\nC:\\Documents and Settings\\administrator\\Local Settings\\Temp\\\n
问题的原因:使用System.Environment.GetEnvironmentVariable("TEMP")获取临时文件夹路径是不正确的,因为环境变量可以被覆盖,所以TEMP变量不一定是临时文件夹的路径。
解决方法:正确的方法是使用System.IO.Path.GetTempPath()来获取临时文件夹路径。这个方法可以确保获取到正确的临时文件夹路径。使用System.IO.Path.GetTempPath()比使用System.Environment.GetEnvironmentVariable("TEMP")更安全,因为任何恶意用户都可以更改环境变量,以便利用你的程序。如果你以管理员权限运行并且恶意软件可以在程序执行时修改你的代码,它们可以执行以管理员身份运行的shellcode,因为它已被存储在TEMP文件夹中。
此外,System.IO.Path.GetTempPath()和System.Environment.GetEnvironmentVariable("TEMP")之间有两个主要的区别。System.IO.Path.GetTempPath()首先检查"TMP"变量,然后是"TEMP"变量,最后是"USERPROFILE"变量。如果找不到这些变量,则返回Windows文件夹的路径。它还保证返回正确的路径,但不能保证路径存在。
然而,如果您没有TMP变量(在最近的Windows版本中是默认情况),那么这正是接受的答案所做的,不是吗?GetTempPath()也依赖于环境变量,如果您阅读内核文档,所以正如用户Logman指出的,没有理由不使用GetEnvironmentVariable()...它们都有相同的弱点。
如何为当前用户获取临时文件夹?
System.IO.Path.GetTempPath()
只是对Kernel32中的GetTempPath(..)
进行本机调用的包装器。
请参阅http://msdn.microsoft.com/en-us/library/aa364992(VS.85).aspx中的内容。
从该页面中复制出来的内容:
GetTempPath函数按照以下顺序检查环境变量的存在,并使用找到的第一个路径:
- TMP环境变量指定的路径。
- TEMP环境变量指定的路径。
- USERPROFILE环境变量指定的路径。
- Windows目录。
对于我来说,“Windows目录”到底是指Windows下的临时目录还是Windows目录本身并不完全清楚。将临时文件转储到Windows目录本身听起来像是一个不可取的情况,但谁知道呢。
因此,结合该页面和您的帖子,我猜测TMP、TEMP或USERPROFILE变量中的任何一个都指向Windows路径,或者它们未设置,它会回退到Windows临时路径。
TEMP
环境变量将在两个位置设置:对于用户本身和对于本地计算机。如果未为用户设置,那么将使用本地计算机的变量,而默认安装中始终设置了该变量。因此,搜索通常会在第二步停止。在测试中,如果TMP
、TEMP
和USERPROFILE
都未设置,则实际上会回退到%SystemRoot%
(C:\Windows\
)。
在以“Local System”身份运行的Windows服务中执行的代码,或者在由此类服务启动的应用程序中,有时会使用C:\Windows\Temp文件夹作为临时文件夹。
来自您链接的文档中指出:“返回的字符串以反斜杠结尾,例如,"C:\TEMP"。但是他们的示例实际上并没有以反斜杠结尾。
无法保证您的应用程序对该函数返回的路径具有写入权限。那么如果您尝试使用IsolatedStorage呢?