Як отримати тимчасову папку для поточного користувача


395

В даний час я використовую наступну функцію, щоб отримати тимчасовий шлях до поточного користувача:

string tempPath = System.IO.Path.GetTempPath();

На деяких машинах він дає мені шлях до папки temp поточного користувача, наприклад:

C: \ Документи та налаштування \ адміністратор \ Місцеві настройки \ Темп \

На деяких машинах він дає мені шлях до папки до системних темп:

C: \ Windows \ TEMP

Документація MSDN також говорить, що вище API повертає тимчасову папку поточної системи.

Чи є інший API, який дає мені шлях тимчасової папки поточного користувача, як це:

C: \ Документи та налаштування \ адміністратор \ Місцеві настройки \ Темп \


2
Поведінка System.Environment.GetEnvironmentVariable ("TEMP") така ж, як GetTempPath (). У моїй машині для облікового запису "адміністратор" обидва API повертають "C: \ WINDOWS \ TEMP", але для облікового запису "Network Service" обидва API повертають "C: \ Документи та налаштування \ Network Service \ Local Settings \ Temp \".
Anoop

1
Можливо, в обліковому записі "адміністратора" є тимчасова папка C: \ Windows \ Temp?
Олена

2
Чи є якась конкретна причина, чому ви хочете отримати тимчасовий шлях під C: \ Документи та налаштування \ завжди?
Нолдорін

11
FYI: якщо ви дійсно хочете папку системи тимчасовий, а ні (якщо він встановлений) користувача можна використовувати Environment.GetEnvironmentVariable ( «Темп», EnvironmentVariableTarget.Machine)
piers7

1
У минулому я часто використовував тимчасові папки і ніколи не піклувався про те, де це було, доки може статися очищення, щоб диск не споживався повністю. Чи не суть тимчасової папки для тимчасового використання - неприємний заповнювач? Чому API не може бути невідомим та обробляється ним? Чи слід використовувати налаштоване, добре відоме місце замість temp?
barrypicker

Відповіді:


405

System.IO.Path.GetTempPath()є лише обгорткою для рідного дзвінка GetTempPath(..)в Kernel32.

Погляньте на http://msdn.microsoft.com/en-us/library/aa364992(VS.85).aspx

Скопійовано із цієї сторінки:

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

  • Шлях, визначений змінною середовища TMP.
  • Шлях, визначений змінною середовища TEMP.
  • Шлях, визначений змінною середовища USERPROFILE.
  • Каталог Windows.

Мені не зовсім зрозуміло, чи означає "Каталог Windows" тимчасовий каталог під Windows або сам каталог Windows. Скидання тимчасових файлів у сам каталог Windows звучить як небажаний випадок, але хто знає.

Таким чином, поєднуючи цю сторінку з вашою публікацією, я б здогадався, що будь-яка із змінних TMP, TEMP або USERPROFILE для вашого адміністратора користувача вказує на шлях Windows, інакше вони не встановлені, і це відновлює шлях до темп для Windows.


14
TEMPМінлива оточення буде встановлена в двох місцях: для самого користувача, так і для локальної машини. Якщо він не встановлений для користувача, то використовується локальна машина, яка завжди встановлюється в установці за замовчуванням. Тому пошук зазвичай зупиняється на другому кроці. При тестуванні, якщо TMP, TEMPі USERPROFILEвсе встановлено, що на насправді робить відкат до %SystemRoot%( C:\Windows\).
Боб

1
Код, який виконується в службах Windows, які працюють в розділі "Локальна система", або в додатках, запущених такою службою, папка C: \ Windows \ Temp іноді використовується як тимчасова папка.
NineBerry

1
Документація з вашого посилання говорить так: "Повернута рядок закінчується зворотною косою рисою, наприклад," C: \ TEMP ". Але їх приклад насправді не закінчується зворотною косою рисою
dcp

Ви не гарантуєте, що будете мати дозвіл на написання шляху, повернутого цією функцією у вашій програмі. А як бути, якщо ви спробували IsolatedStorage замість цього?
Іван

35

НЕ використовуйте це:

System.Environment.GetEnvironmentVariable("TEMP")

Змінні середовища можуть бути замінені, тому TEMPзмінна не обов'язково є каталогом.

Правильний спосіб - використовувати System.IO.Path.GetTempPath()як у прийнятій відповіді.


34
@ImmortalBlue Тому що це не обов'язково тимчасовий каталог. Правильний спосіб отримати тимчасовий каталог - зателефонувати System.IO.Path.GetTempPath().
Девід Геффернан

9
Я знаю, що це досить старе, але я зрозумів, що залишу записку для когось цікавого: Мало того, що це не обов'язково тимчасовий каталог, як сказав @DavidHeffernan, але ви просто не маєте поняття, що це таке. Хоча це не так багато проблем з .NET, це вважається поганою практикою, оскільки будь-який зловмисний користувач міг змінити цю змінну середовища з метою використання вашої програми. Якщо ви працюєте з правами адміністратора, і зловмисне програмне забезпечення може змінювати ваш код під час його виконання, вони можуть, наприклад, виконувати код коду в якості адміністратора, оскільки він зберігається в TEMP.
sraboy

Є 2 основні відмінності між GetEnvironmentVariable("TEMP")та GetTempPath(). GetTempPath()спочатку перевіряє змінну "TMP", потім "TEMP" і нарешті "USERPROFILE". Якщо ви не знайдете жодного з них, його шлях повернення до папки Windows. Це також гарантує, що він повертає правильний шлях, але це не є гарантією існування шляху.
Логман

Але це саме те, що приймає відповідь, якщо у вас немає змінної TMP (сценарій за замовчуванням для останніх версій Windows), чи не так?
PRMan

1
GetTempPathу будь-якому випадку покладається на ваші змінні середовища, якщо ви читаєте документацію ядра, тому, як вказує користувач Logman, немає причин не використовувати GetEnvironmentVariable... вони обоє мають однакову слабкість.
AnorZaken

22

У мене є така ж вимога - ми хочемо помістити журнали в конкретний кореневий каталог, який повинен існувати в середовищі.

public static readonly string DefaultLogFilePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

Якщо я хочу поєднати це з підкаталогом, я повинен мати можливість використовувати Path.Combine( ... ) .

У GetFolderPathметоді є перевантаження для спеціальних параметрів папок, яка дозволяє контролювати, створений або просто перевірений вказаний шлях.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.