Что определяет возвращаемое значение 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 (на сервере) если это веб-приложение выполняется от клиента. В первом случае ничего страшного - учетная запись, запускающая приложение, имеет права на эту папку. В последнем случае, возможно, это большое дело, если учетная запись удостоверения пула приложений (или учетная запись, которую вы можете использовать для олицетворения в Интернете.конфигурационный файл для веб-приложение) не имеет привилегий 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 заканчивается в a конечная косая черта, поэтому просто соедините ее непосредственно с именем переменной/файла, чтобы получить правильный путь.
-том
P. S. Вы должны добавить 2 пространства имен, чтобы сделать эту работу: система.IO и System.Отражение
Он называет GetTempPath
пожалуйста, попробуйте использовать следующее, Чтобы определить хорошее место для ваших данных:
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, }