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

时间:2010-03-02 17:38:01

标签: c# .net 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()从哪里获取它的价值?组策略?注册表?

我用Google搜索,但无济于事。

6 个答案:

答案 0 :(得分:53)

(使用Reflector)Path.GetTempPath()最终调用Win32函数GetTempPath(来自kernel32.dll)。该州的MDSN文档:

  

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

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

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

答案 1 :(得分:13)

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

非常重要的是要意识到你需要清理你的临时文件,因为当你在单个目录中达到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():

和TFS会在您尝试构建时为您提供:

TF215097: An error occurred while initializing a build for build 
definition XXXXX: The file exists. 

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

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

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

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

对于我来说,NetworkService运行时我得到了

 C:\Windows\TEMP\

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

 C:\Users\www.example.com\AppData\Local\Temp

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

答案 2 :(得分:2)

我注意到GetTempPath()可以带回本地用户的文档&amp;设置\用户\本地设置\临时路径,如果它是一个控制台应用程序,并注意到它可以带回C:\ WINDOWS \ Temp(在服务器上),如果它是从客户端运行的Web应用程序。在前一种情况下,没什么大不了的 - 运行应用程序的帐户拥有该文件夹的权限。在后者中,如果应用程序池标识帐户(或您可能用于在Web应用程序的Web.config文件中模拟的帐户)没有C:\ WINDOWS \ Temp的权限,则可能是一个大问题。服务器(这是一个很大的机会)。所以对于我的控制台应用程序来说,毫无疑问,在哪里编写临时文件,将字符串硬编码到INI文件中对我来说是最好和最简单的,对于Web应用程序,在web.config中进行硬编码使用ConfigurationManager.AppSettings [“myKey”]工作,或者如果它是一个Web应用程序,使用此函数将文件发送到ASP临时文件文件夹并在那里使用它:

public static string findFileDirectory(string file)
{
    // Get the directory where our service is being run from
    string temppath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    // Ensure proper path notation so we can add the INI file name
    if (!temppath.EndsWith(@"\")) temppath += @"\";

    return temppath;
}

并将其称为:

    string tempFolderPath = findFileDirectory("Web.config");
    tempFolderPath = tempFolderPath.Replace(@"\\", @"\");

并且只使用“tempFolderPath”而不是之前使用Path.GetTempPath()的地方。这个功能很棒,而且功能强大。我在我的代码中使用它来代替这个邪恶的GetTempPath()方法,所以我知道我的应用程序可以做它需要做的事情,因为ASP Temp Files文件夹应该具有它的操作所需的所有权限(DOMAIN \ NETWORK SERVICE和应用程序池ID帐户需要完全控制)。 tempFolderPath以尾部斜杠结尾,因此只需直接与变量/文件名连接即可获得正确的路径。

- 汤姆

P.S。您需要添加2个名称空间才能使该功能起作用:System.IO和System.Reflection

答案 3 :(得分:1)

它调用GetTempPath函数。文档说明了它检查的环境变量。

答案 4 :(得分:1)

请尝试使用以下内容确定您的数据的好地方:

Environment.GetFolderPath(Environment.SpecialFolder folder);

Where Specialfolder

// Summary:
//     Specifies enumerated constants used to retrieve directory paths to system
//     special folders.
[ComVisible(true)]
public enum SpecialFolder
{
  // Summary:
  //     The logical Desktop rather than the physical file system location.
  Desktop = 0,
  //
  // Summary:
  //     The directory that contains the user's program groups.
  Programs = 2,
  //
  // Summary:
  //     The directory that serves as a common repository for documents.
  Personal = 5,
  //
  // Summary:
  //     The "My Documents" folder.
  MyDocuments = 5,
  //
  // Summary:
  //     The directory that serves as a common repository for the user's favorite
  //     items.
  Favorites = 6,
  //
  // Summary:
  //     The directory that corresponds to the user's Startup program group.
  Startup = 7,
  //
  // Summary:
  //     The directory that contains the user's most recently used documents.
  Recent = 8,
  //
  // Summary:
  //     The directory that contains the Send To menu items.
  SendTo = 9,
  //
  // Summary:
  //     The directory that contains the Start menu items.
  StartMenu = 11,
  //
  // Summary:
  //     The "My Music" folder.
  MyMusic = 13,
  //
  // Summary:
  //     The directory used to physically store file objects on the desktop.
  DesktopDirectory = 16,
  //
  // Summary:
  //     The "My Computer" folder.
  MyComputer = 17,
  //
  // Summary:
  //     The directory that serves as a common repository for document templates.
  Templates = 21,
  //
  // Summary:
  //     The directory that serves as a common repository for application-specific
  //     data for the current roaming user.
  ApplicationData = 26,
  //
  // Summary:
  //     The directory that serves as a common repository for application-specific
  //     data that is used by the current, non-roaming user.
  LocalApplicationData = 28,
  //
  // Summary:
  //     The directory that serves as a common repository for temporary Internet files.
  InternetCache = 32,
  //
  // Summary:
  //     The directory that serves as a common repository for Internet cookies.
  Cookies = 33,
  //
  // Summary:
  //     The directory that serves as a common repository for Internet history items.
  History = 34,
  //
  // Summary:
  //     The directory that serves as a common repository for application-specific
  //     data that is used by all users.
  CommonApplicationData = 35,
  //
  // Summary:
  //     The System directory.
  System = 37,
  //
  // Summary:
  //     The program files directory.
  ProgramFiles = 38,
  //
  // Summary:
  //     The "My Pictures" folder.
  MyPictures = 39,
  //
  // Summary:
  //     The directory for components that are shared across applications.
  CommonProgramFiles = 43,
}

答案 5 :(得分:1)

如果您使用C#MacOS上使用Mono Framework,则Path.GetTempPath()返回的值是环境变量TMPDIR的值。

运行echo $TMPDIR通常会返回如下值:

/var/folders/{2 character random-string}/{random-string}/T