Что определяет возвращаемое значение Path.GetTempPath()?


в настоящее время, я использую Path.GetTempPath() чтобы выяснить, где писать мои файлы журнала, но недавно я столкнулся с машиной пользователя, где возвращенный путь был не тем, что я ожидал.

обычно, возвращаемый путь C:Documents и настройки[userid]локальные настройкиTemp но в данном случае это было C:Temp

обычно это не было бы проблемой, но по какой-то причине у пользователя, о котором идет речь, не было доступа к записи C:Temp

Я дважды проверил переменные среды, и переменная среды пользователя указывала, как и ожидалось, на C:Documents и настройки[userid]локальные настройкиTemp, в то время как переменная среды системы указывала на C:WINNTTemp.

Так... где же Path.GetTempPath() получать это значение ? Групповая Политика? Реестр?

я погуглил, но безрезультатно.

6 60

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,
}

если вы используете C# on MacOS используя Mono Framework затем значение, возвращенное Path.GetTempPath() - это значение переменной окружения TMPDIR.

под управлением echo $TMPDIR обычно возвращает значение типа :

/var/folders/{2 character random-string}/{random-string}/T