目前,我使用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搜索,但无济于事。
答案 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