是什么决定了Path.GetTempPath()的返回值?

And*_*man 67 .net c# environment-variables special-folders

目前,我Path.GetTempPath()用来确定在哪里写我的日志文件,但最近我遇到了一个用户的机器,其中返回的路径不是我所期望的.

通常,返回的路径是C:\ Documents and Settings\[userid]\Local Settings\Temp 但在这种情况下,它是C:\ Temp

这通常不是问题,但由于某种原因,有问题的用户无权写入C:\ Temp

我仔细检查了环境变量,并且USER环境变量按预期指向C:\ Documents and Settings\[userid]\Local Settings\Temp,而SYSTEM环境变量指向C:\ WINNT\Temp.

所以...从哪里Path.GetTempPath()获得它的价值?组策略?注册?

我用谷歌搜索,但无济于事.

adr*_*nks 56

(使用Reflector)Path.GetTempPath()最终调用Win32函数GetTempPath(来自kernel32.dll).此状态的MDSN文档:

GetTempPath函数按以下顺序检查环境变量是否存在,并使用找到的第一个路径:

  • TMP环境变量指定的路径.
  • TEMP环境变量指定的路径.
  • USERPROFILE环境变量指定的路径.
  • Windows目录.

请注意,它们还声明它不会检查路径是否实际存在或可以写入,因此您可能最终尝试将日志文件写入不存在的路径,或者您无法访问的路径.


Sim*_*ver 14

免责声明:不是答案 - 但重要的阅读!

非常重要的是要意识到你需要清理你的临时文件,因为当你在单个目录中达到65536时,框架将不再创建,你的应用程序将会爆炸!

他们将积累数月和数月,然后你会收到这样的消息:

System.IO.IOException: The file exists.

  at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
  at System.IO.__Error.WinIOError()
  at System.IO.Path.InternalGetTempFileName(Boolean checkHost)
  at System.IO.Path.GetTempFileName():
Run Code Online (Sandbox Code Playgroud)

当你尝试构建时,TFS会给你这个:

TF215097: An error occurred while initializing a build for build 
definition XXXXX: The file exists. 
Run Code Online (Sandbox Code Playgroud)

您需要做的就是浏览到该Path.GetTempPath()文件夹并致电del tmp*

注意:如果您有一个ASP.NET应用程序创建临时文件,其临时目录可能与当前登录用户不同

如果有疑问(或恐慌),只需创建一个aspx页面打印出正在使用的位置:

 TempPath.aspx
 <%@ Page Language="C#"%>
 Temp path: <%= System.IO.Path.GetTempPath() %>
Run Code Online (Sandbox Code Playgroud)

对我来说,运行的时候为NetworkService我得到

 C:\Windows\TEMP\
Run Code Online (Sandbox Code Playgroud)

当作为AppPool(名为www.example.com)运行时,路径可能是:

 C:\Users\www.example.com\AppData\Local\Temp
Run Code Online (Sandbox Code Playgroud)

PS.我认为即使您之后删除文件也会发生这种情况,因为文件名增加了.

  • 今天早上进入办公室,生产系统已经死亡.结果我们的一个开发人员使用Path.GetTempFileName()生成随机文件名以在别处使用.他不知道它还在c:\​​ windows\temp中创建了一个零字节文件.系统必须已尝试创建其第65537个文件!这条评论为我们节省了数小时的停机时间 感谢您在2年前发帖! (7认同)