Что определяет возвращаемое значение Path.GetTempPath()?
В настоящее время я использую 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()
получает значение? Групповая политика? Реестр?
У меня есть Googled, но безрезультатно.
Ответы
Ответ 1
(Использование рефлектора) Path.GetTempPath()
в конечном итоге вызывает функцию Win32 GetTempPath (из kernel32.dll). Документы MDSN для этого состояния:
Функция GetTempPath проверяет наличие переменных окружения в следующем порядке и использует первый найденный путь:
- Путь, указанный переменной среды TMP.
- Путь, указанный переменной среды TEMP.
- Путь, указанный переменной среды USERPROFILE.
- Каталог Windows.
Обратите внимание, что они также указывают, что он не проверяет, действительно ли путь существует или может быть записан на, поэтому вы можете попытаться записать ваши файлы журналов в путь, который не работает 't существует, или тот, к которому вы не можете получить доступ.
Ответ 2
Отказ от ответственности: не ответ - но важное чтение!
Очень важно осознать, что вам нужно очистить свои временные файлы, потому что, когда вы нажимаете 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\
PS. Я думаю, что это может произойти, даже если вы удалите файл после этого, потому что имя файла увеличивается.
Ответ 3
Я заметил, что GetTempPath() может вернуть локальный пользователь Documents and Settings\user\Local Settings\Temp path, если это консольное приложение, и заметил, что он может вернуть C:\WINDOWS\Temp (на сервере) если это веб-приложение запускается от клиента. В первом случае не имеет большого значения - учетная запись, выполняющая приложение, имеет права на эту папку. В последнем случае, может быть, это очень важно, если учетная запись идентификатора пула приложений (или учетная запись, которую вы можете использовать для олицетворения в файле Web.config для веб-приложения) не имеет привилегий для C:\WINDOWS\Temp on сервер (это большой шанс, которого нет). Поэтому для моих консольных приложений, так что нет никаких вопросов, где написаны временные файлы, жесткое кодирование строки в INI файл является самым лучшим и легким для меня и для веб-приложения, жестко-кодирующим его в web.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" вместо того, где раньше использовался Path.GetTempPath(). Эта функция работает потрясающе, и я использую ее в своем коде вместо этого злого метода GetTempPath(), поэтому я знаю, что мое приложение может делать то, что ему нужно, поскольку папка ASP Temp Files должна иметь все разрешения, необходимые для ее операций ( Для домена DOMAIN\NETWORK SERVICE и для учетной записи ID приложения требуется полный контроль). tempFolderPath заканчивается в завершающей косой чертой, поэтому просто соглашайтесь непосредственно с вашим именем переменной/файла, чтобы получить правильный путь.
-Tom
P.S. Вам нужно добавить 2 пространства имен, чтобы эта функция работала: System.IO и System.Reflection
Ответ 4
Он вызывает функцию GetTempPath. Документация объясняет, какие переменные среды он проверяет.
Ответ 5
Попробуйте использовать следующее, чтобы определить хорошее место для ваших данных:
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 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 favorite
// items.
Favorites = 6,
//
// Summary:
// The directory that corresponds to the user Startup program group.
Startup = 7,
//
// Summary:
// The directory that contains the user 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,
}