目前,我使用
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\温度.
那么...
Path.GetTempPath()
从哪里获得它的价值?组策略?注册表?
我用谷歌搜索过,但没有结果。
(使用Reflector)
Path.GetTempPath()
最终调用Win32函数GetTempPath(来自kernel32.dll)。此状态的 MDSN 文档:
GetTempPath 函数按以下顺序检查环境变量是否存在,并使用找到的第一个路径:
- TMP环境变量指定的路径。
- TEMP环境变量指定的路径。
- USERPROFILE环境变量指定的路径。
- Windows 目录。
请注意,他们还指出 它不会检查路径是否实际存在或是否可以写入,因此您最终可能会尝试将日志文件写入不存在的路径,或者写入不存在的路径您无法访问。
认识到您需要清除临时文件非常重要,因为当您在单个目录中达到 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。我认为即使您事后删除该文件也可能会发生这种情况,因为文件名增加了。
如果您在
C#
上使用 MacOS
使用 Mono Framework
,则 Path.GetTempPath()
返回的值是环境变量 TMPDIR
的值。
运行
echo $TMPDIR
通常返回如下值:
/var/folders/{2 character random-string}/{random-string}/T
我注意到 GetTempPath() 可以带回本地用户的 Documents & Settings\user\Local Settings\Temp 路径(如果它是控制台应用程序),并注意到如果它是控制台应用程序,它可以带回 C:\WINDOWS\Temp (在服务器上)从客户端运行的网络应用程序。 在前一种情况下,没什么大不了的 - 运行应用程序的帐户拥有该文件夹的权限。 在后者中,如果应用程序池身份帐户(或您可能在 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 以尾部斜杠结尾,因此只需直接与变量/文件名连接即可获得正确的路径。
-汤姆
附注您需要添加 2 个命名空间才能使该功能正常工作:System.IO 和 System.Reflection
请尝试使用以下方法来确定数据的合适位置:
Environment.GetFolderPath(Environment.SpecialFolder folder);
特殊文件夹在哪里
// 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,
}
它调用 GetTempPath 函数。该文档解释了它检查哪些环境变量。
你可以像这样猫临时路径
Path.GetTempPath();