Что определяет возвращаемое значение Path.GetTempPath()?
в настоящее время, я использую Path.GetTempPath()
чтобы выяснить, где писать мои файлы журнала, но недавно я наткнулся на машину пользователя, где путь вернулся не то, что я ожидал.
обычно возвращаемый путь равен C:Documents и настройки[userid]локальные настройкиTemp но в данном случае это было C:Temp
обычно это не было бы проблемой, но по какой-то причине у пользователя не было доступа к записи C:Temp
Я дважды проверил переменные среды, и переменная среды пользователя указывала, как ожидалось, на C:Documents и настройки[userid]локальные настройкиTemp, в то время как переменная среды системы указывала на C:WINNTTemp.
Так... где Path.GetTempPath()
получать это значение ? Групповая Политика? Реестр?
я погуглил, но безрезультатно.
6 ответов
(Через Отражатель) 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 аппликация создание временных файлов его каталог temp, вероятно, будет отличаться от текущего зарегистрированного пользователя
если вы сомневаетесь (или в панике), просто создайте страницу 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. Я думаю, что это может произойти, даже если вы удалите файл после этого, потому что имя файла увеличивается.
Я заметил, что GetTempPath () может вернуть документы и настройки локального пользователя\user\Local Settings\Temp path, если это консольное приложение, и заметил, что он может вернуть C:\WINDOWS\Temp (на сервере), если это веб-приложение запускается с клиента. В первом случае ничего страшного - учетная запись, на которой работает приложение, имеет права на эту папку. В последнем случае, возможно, это большое дело, если учетная запись удостоверения пула приложений (или учетная запись, которую вы можете использовать для олицетворения в Интернете.файл config для веб-приложение) не имеет привилегий C:\WINDOWS\Temp на сервере (что является большим шансом, что это не так). Поэтому для моих консольных приложений, чтобы не возникало вопросов, где записываются временные файлы, жесткое кодирование строки в INI-файл является лучшим и самым простым для меня, а для веб-приложения-жесткое кодирование в интернете.config и получение его с помощью ConfigurationManager.AppSettings ["myKey"] работает, или если это веб-приложение, используйте эту функцию для отправки файла в папки временных файлов 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" вместо того, где вы использовали путь.GetTempPath() перед. Эта функция работает потрясающе , и я использую ее в своем коде вместо этого злого метода GetTempPath (), поэтому я знаю, что мое приложение может делать то, что ему нужно, поскольку папка ASP Temp Files должна иметь все разрешения, необходимые для ее операций (учетная запись DOMAIN\NETWORK SERVICE и App Pool ID нуждается в полном контроле). tempFolderPath заканчивается trailing slash, поэтому просто конкат непосредственно с именем переменной / файла, чтобы получить правильный путь.
-том
P. S. Вы должны добавить 2 пространства имен, чтобы сделать эту работу: система.IO и System.Отражение!--3-->
пожалуйста, попробуйте использовать следующее, Чтобы определить хорошее место для ваших данных:
Environment.GetFolderPath(Environment.SpecialFolder folder);
Где 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,
}
если вы используете C#
on MacOS
используя Mono Framework
затем значение, возвращенное Path.GetTempPath()
значение переменной среды TMPDIR
.
под управлением echo $TMPDIR
обычно возвращает значение типа :
/var/folders/{2 character random-string}/{random-string}/T