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

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

Обычно, возвращенный путь является C:\Documents and Settings\[userid]\Local Settings\Temp, но в этом случае, это был C:\Temp

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

Я проверил переменные среды дважды, и переменная Пользовательской среды указывала как ожидалось на C:\Documents and Settings\[userid]\Local Settings\Temp, пока Системная переменная указывала на C:\WINNT\Temp.

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

Я Погуглил, но напрасно.

67
задан TRiG 26 June 2012 в 17:40
поделиться

4 ответа

(Использование отражателя) Path.GetTempPath () в конечном итоге вызывает функцию Win32 GetTempPath (из kernel32.dll). Документы MDSN для этого состояния:

Функция GetTempPath проверяет наличие переменных среды в следующем порядке и использует первый найденный путь:

  • Путь, указанный переменной среды TMP.
  • Путь, указанный переменной среды TEMP.
  • Путь, указанный в переменной среды USERPROFILE.
  • Каталог Windows.

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

56
ответ дан 24 November 2019 в 14:43
поделиться

Он вызывает функцию GetTempPath . В документации объясняется, какие переменные среды он проверяет.

1
ответ дан 24 November 2019 в 14:43
поделиться

Я заметил, что GetTempPath() может вернуть путь Documents & Settings\user\Local Settings\Temp локального пользователя, если это консольное приложение, и заметил, что она может вернуть путь C:\WINDOWS\Temp (на сервере), если это веб-приложение запускается с клиента. В первом случае ничего страшного - права на эту папку есть у учетной записи, запускающей приложение. Во втором случае, это может быть серьезной проблемой, если учетная запись App Pool Identity (или учетная запись, которую вы используете для имперсонализации в файле Web.config для веб-приложения) не имеет прав на C:\WINDOWS\Temp на сервере (что очень вероятно). Поэтому для моих консольных приложений, чтобы не возникало вопросов, куда записываются временные файлы, я лучше и проще всего ввожу строку в 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 и учетная запись App Pool ID должны иметь полный контроль). tempFolderPath заканчивается косой чертой, поэтому просто соедините ее непосредственно с именем вашей переменной/файла, чтобы получить правильный путь.

-Tom

P.S. Вам нужно добавить 2 пространства имен, чтобы эта функция работала: System.IO и System.Reflection

2
ответ дан 24 November 2019 в 14:43
поделиться

Пожалуйста, попробуйте использовать следующее, чтобы определить хорошее место для ваших данных:

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,
}
1
ответ дан 24 November 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: