So erhalten Sie einen temporären Ordner für den aktuellen Benutzer

395

Derzeit verwende ich die folgende Funktion, um den temporären Ordnerpfad für den aktuellen Benutzer abzurufen:

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

Auf einigen Computern gibt es mir den temporären Ordnerpfad des aktuellen Benutzers wie:

C: \ Dokumente und Einstellungen \ Administrator \ Lokale Einstellungen \ Temp \

Auf einigen Computern gibt es mir den Pfad des temporären Systemordners wie:

C: \ Windows \ TEMP

In der MSDN-Dokumentation heißt es außerdem, dass die obige API den temporären Ordner des aktuellen Systems zurückgibt.

Gibt es eine andere API, die mir den temporären Ordnerpfad des aktuellen Benutzers wie folgt angibt:

C: \ Dokumente und Einstellungen \ Administrator \ Lokale Einstellungen \ Temp \

Anoop
quelle
2
Das Verhalten von System.Environment.GetEnvironmentVariable ("TEMP") ist dasselbe wie bei GetTempPath (). Auf meinem Computer für Konto 'Administrator' geben beide APIs "C: \ WINDOWS \ TEMP" zurück, für Konto 'Netzwerkdienst' geben beide APIs "C: \ Dokumente und Einstellungen \ Netzwerkdienst \ Lokale Einstellungen \ Temp \" zurück.
Anoop
1
Vielleicht hat das Administratorkonto tatsächlich einen temporären Ordner mit dem Namen C: \ Windows \ Temp?
Helen
2
Gibt es einen bestimmten Grund, warum Sie den temporären Pfad unter C: \ Dokumente und Einstellungen \ immer abrufen möchten?
Noldorin
11
Zu Ihrer Information: Wenn Sie Sie den temporären Systemordner wollen, nicht die des Benutzers (falls eingestellt) Sie können Environment.GetEnvironmentVariable verwenden ( „temp“, EnvironmentVariableTarget.Machine)
piers7
1
In der Vergangenheit habe ich häufig temporäre Ordner verwendet und mich nie darum gekümmert, wo sie sich befanden, solange eine Bereinigung möglich ist, damit die Disc nicht vollständig verbraucht wird. Ist der Sinn eines temporären Ordners für die vorübergehende Verwendung nicht - Junk-Platzhalter? Warum kann es nicht unbekannt sein und von der API verarbeitet werden? Sollten Sie einen konfigurierbaren, bekannten Ort anstelle von Temp verwenden?
Barrypicker

Antworten:

405

System.IO.Path.GetTempPath()ist nur ein Wrapper für einen nativen Aufruf von GetTempPath(..)Kernel32.

Schauen Sie sich http://msdn.microsoft.com/en-us/library/aa364992(VS.85).aspx an

Von dieser Seite kopiert:

Die GetTempPath-Funktion überprüft das Vorhandensein von Umgebungsvariablen in der folgenden Reihenfolge und verwendet den ersten gefundenen Pfad:

  • Der von der TMP-Umgebungsvariablen angegebene Pfad.
  • Der von der Umgebungsvariablen TEMP angegebene Pfad.
  • Der von der Umgebungsvariablen USERPROFILE angegebene Pfad.
  • Das Windows-Verzeichnis.

Mir ist nicht ganz klar, ob "Das Windows-Verzeichnis" das temporäre Verzeichnis unter Windows oder das Windows-Verzeichnis selbst bedeutet. Das Speichern von temporären Dateien im Windows-Verzeichnis selbst klingt nach einem unerwünschten Fall, aber wer weiß.

Wenn Sie diese Seite mit Ihrem Beitrag kombinieren, würde ich vermuten, dass eine der TMP-, TEMP- oder USERPROFILE-Variablen für Ihren Administrator-Benutzer auf den Windows-Pfad verweist, oder dass sie nicht festgelegt sind und ein Fallback auf den Windows-temporären Pfad erfolgt.

Niall Connaughton
quelle
14
Die TEMPUmgebungsvariable wird an zwei Stellen festgelegt: für den Benutzer selbst und für den lokalen Computer. Wenn es nicht für den Benutzer festgelegt ist, wird das für den lokalen Computer verwendet, und dies wird immer in einer Standardinstallation festgelegt. Daher stoppt die Suche normalerweise im zweiten Schritt. Bei der Prüfung, ob TMP, TEMPund USERPROFILEalle sind nicht gesetzt, es tatsächlich tut zu fallen zurück %SystemRoot%( C:\Windows\).
Bob
1
Code, der in Windows-Diensten ausgeführt wird, die unter "Lokales System" ausgeführt werden, oder in Anwendungen, die von einem solchen Dienst gestartet wurden. Der Ordner C: \ Windows \ Temp wird manchmal als temporärer Ordner verwendet.
NineBerry
1
In der Dokumentation Ihres Links heißt es: "Die zurückgegebene Zeichenfolge endet mit einem Backslash, z. B." C: \ TEMP ". Ihr Beispiel endet jedoch nicht mit einem Backslash.
dcp
Es kann nicht garantiert werden, dass Sie über eine Schreibberechtigung für den von dieser Funktion in Ihrer Anwendung zurückgegebenen Pfad verfügen. Was ist, wenn Sie stattdessen IsolatedStorage ausprobiert haben?
John
35

Verwenden Sie dies NICHT :

System.Environment.GetEnvironmentVariable("TEMP")

Umgebungsvariablen können überschrieben werden, daher ist die TEMPVariable nicht unbedingt das Verzeichnis.

Der richtige Weg ist, System.IO.Path.GetTempPath()wie in der akzeptierten Antwort zu verwenden.

Helen
quelle
34
@ImmortalBlue Weil das nicht unbedingt das temporäre Verzeichnis ist. Der richtige Weg, um das temporäre Verzeichnis zu erhalten, ist ein Aufruf System.IO.Path.GetTempPath().
David Heffernan
9
Ich weiß, dass dies ziemlich alt ist, aber ich dachte, ich würde jedem, der neugierig ist, eine Notiz hinterlassen: Es ist nicht nur nicht unbedingt das temporäre Verzeichnis, wie @DavidHeffernan sagte, sondern Sie haben einfach keine Ahnung, was es ist. Obwohl dies mit .NET kein so großes Problem darstellt, wird es als schlechte Praxis angesehen, da jeder böswillige Benutzer diese Umgebungsvariable hätte ändern können, um Ihr Programm auszunutzen. Wenn Sie mit Administratorrechten arbeiten und die Malware Ihren Code während der Ausführung ändern kann, können sie beispielsweise Shellcode als Administrator ausführen, da er in TEMP gespeichert wurde.
Sraboy
Es gibt 2 Hauptunterschiede zwischen GetEnvironmentVariable("TEMP")und GetTempPath(). GetTempPath()prüft zuerst auf die Variable "TMP", dann auf "TEMP" und schließlich auf "USERPROFILE". Wenn Sie keinen von diesen finden, wird der Pfad zum Windows-Ordner zurückgegeben. Es wird auch garantiert, dass der korrekte Pfad zurückgegeben wird, es wird jedoch nicht garantiert, dass der Pfad vorhanden ist.
Logman
Aber genau das bewirkt die akzeptierte Antwort, wenn Sie keine TMP-Variable haben (Standardszenario in neueren Windows-Versionen), nicht wahr?
PRMan
1
GetTempPathstützt sich ohnehin auf Ihre Umgebungsvariablen, wenn Sie die Kerneldokumentation lesen. Wie Benutzer Logman darauf hinweist, gibt es keinen Grund, sie nicht zu verwenden. GetEnvironmentVariableBeide haben dieselbe Schwäche.
AnorZaken
22

Ich habe die gleiche Anforderung - wir möchten Protokolle in einem bestimmten Stammverzeichnis ablegen, das in der Umgebung vorhanden sein sollte.

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

Wenn ich dies mit einem Unterverzeichnis kombinieren möchte, sollte ich es verwenden können Path.Combine( ... ).

Die GetFolderPathMethode verfügt über eine Überladung für spezielle Ordneroptionen, mit denen Sie steuern können, ob der angegebene Pfad erstellt oder einfach überprüft werden soll.

IAbstract
quelle
-8

Versuchen

Environment.GetEnvironmentVariable("temp");
Ikke
quelle