Cara mendapatkan folder sementara untuk pengguna saat ini

395

Saat ini saya menggunakan fungsi berikut untuk mendapatkan jalur folder sementara untuk pengguna saat ini:

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

Pada beberapa mesin ini memberi saya temp folder path dari pengguna saat ini seperti:

C: \ Documents and Settings \ administrator \ Local Settings \ Temp \

Pada beberapa mesin itu memberi saya path folder temp sistem seperti:

C: \ Windows \ TEMP

Dokumentasi MSDN juga mengatakan bahwa API di atas mengembalikan folder sementara sistem saat ini.

Apakah ada API lain yang tersedia yang memberi saya jalur folder sementara pengguna saat ini seperti ini:

C: \ Documents and Settings \ administrator \ Local Settings \ Temp \

Anoop
sumber
2
Perilaku System.Environment.GetEnvironmentVariable ("TEMP") sama dengan GetTempPath (). Di mesin saya untuk akun 'administrator', kedua API mengembalikan "C: \ WINDOWS \ TEMP" tetapi untuk akun 'Layanan Jaringan' kedua API mengembalikan "C: \ Documents and Settings \ Network Service \ Local Settings \ Temp \".
Anoop
1
Mungkin akun 'administrator' memiliki folder temp C: \ Windows \ Temp?
Helen
2
Apakah ada alasan khusus mengapa Anda ingin mendapatkan jalur sementara di bawah C: \ Documents and Settings \ always?
Noldorin
11
FYI: jika Anda tidak ingin folder sistem temp, bukan pengguna (jika set) Anda dapat menggunakan Environment.GetEnvironmentVariable ( "temp", EnvironmentVariableTarget.Machine)
piers7
1
Di masa lalu, saya sudah sering menggunakan folder temp dan tidak pernah peduli di mana itu, selama pembersihan dapat terjadi sehingga disk tidak sepenuhnya dikonsumsi. Bukankah tujuan folder temp untuk penggunaan sementara - tempat sampah? Mengapa itu tidak diketahui dan ditangani oleh API? Haruskah Anda menggunakan lokasi yang dapat dikonfigurasi dan dikenal bukan sebagai temp?
barrypicker

Jawaban:

405

System.IO.Path.GetTempPath()hanyalah pembungkus untuk panggilan asli ke GetTempPath(..)dalam Kernel32.

Lihatlah http://msdn.microsoft.com/en-us/library/aa364992(VS.85).aspx

Disalin dari halaman itu:

Fungsi GetTempPath memeriksa keberadaan variabel lingkungan dalam urutan berikut dan menggunakan jalur pertama yang ditemukan:

  • Jalur yang ditentukan oleh variabel lingkungan TMP.
  • Jalur yang ditentukan oleh variabel lingkungan TEMP.
  • Jalur yang ditentukan oleh variabel lingkungan USERPROFILE.
  • Direktori Windows.

Tidak sepenuhnya jelas bagi saya apakah "Direktori Windows" berarti direktori temp di bawah windows atau direktori windows itu sendiri. Membuang file temp di direktori windows itu sendiri terdengar seperti kasus yang tidak diinginkan, tetapi siapa tahu.

Jadi, menggabungkan halaman itu dengan posting Anda, saya akan menebak bahwa salah satu dari variabel TMP, TEMP atau USERPROFILE untuk pengguna Administrator Anda menunjuk ke jalur windows, atau mereka tidak ditetapkan dan mengambil fallback ke jalur temp windows.

Niall Connaughton
sumber
14
The TEMPvariabel lingkungan akan ditetapkan di dua tempat: untuk pengguna itu sendiri, dan untuk mesin lokal. Jika tidak disetel untuk pengguna, maka yang untuk mesin lokal akan digunakan, dan itu selalu ditetapkan dalam instalasi default. Karena itu pencarian biasanya berhenti pada langkah kedua. Dalam pengujian, jika TMP, TEMPdan USERPROFILEsemuanya tidak disetel, sebenarnya akan kembali ke %SystemRoot%( C:\Windows\).
Bob
1
Kode yang dijalankan di Layanan Windows yang berjalan di bawah "Sistem Lokal" atau dalam aplikasi yang dimulai oleh layanan seperti itu, folder C: \ Windows \ Temp kadang-kadang digunakan sebagai folder termporary.
NineBerry
1
Dokumentasi dari tautan Anda mengatakan ini: "String yang dikembalikan diakhiri dengan garis miring terbalik, misalnya," C: \ TEMP ". Tetapi contoh mereka tidak benar-benar berakhir dengan garis miring terbalik.
dcp
Anda tidak dijamin bahwa Anda akan memiliki izin tertulis untuk jalur yang dikembalikan oleh fungsi itu dalam aplikasi Anda. Bagaimana jika Anda mencoba IsolatedStorage?
Yohanes
35

JANGAN gunakan ini:

System.Environment.GetEnvironmentVariable("TEMP")

Variabel lingkungan dapat diganti, sehingga TEMPvariabel belum tentu direktori.

Cara yang benar adalah dengan menggunakan System.IO.Path.GetTempPath()seperti pada jawaban yang diterima.

Helen
sumber
34
@ImmortalBlue Karena itu belum tentu direktori temp. Cara yang benar untuk mendapatkan direktori temp adalah dengan menelepon System.IO.Path.GetTempPath().
David Heffernan
9
Saya tahu ini cukup lama tapi saya pikir saya akan meninggalkan catatan untuk siapa pun yang penasaran: Tidak hanya itu belum tentu direktori temp, seperti kata @DavidHeffernan, tetapi Anda tidak tahu apa itu. Meskipun tidak sebanyak masalah dengan .NET, ini dianggap praktik yang buruk karena setiap pengguna jahat dapat mengubah variabel lingkungan untuk mengeksploitasi program Anda. Jika Anda menjalankan dengan hak admin dan malware dapat mengubah kode Anda saat dieksekusi, mereka dapat, misalnya, mengeksekusi shellcode sebagai admin karena telah disimpan dalam TEMP.
sraboy
Ada 2 perbedaan utama antara GetEnvironmentVariable("TEMP")dan GetTempPath(). GetTempPath()memeriksa terlebih dahulu untuk variabel "TMP" lalu "TEMP" dan akhirnya "USERPROFILE". Jika tidak menemukan satu pun dari jalur pengembaliannya ke folder Windows. Ini juga menjamin bahwa ia mengembalikan jalur yang benar tetapi itu tidak menjamin bahwa jalan itu ada.
Logman
Tapi ini persis apa jawaban yang diterima jika Anda tidak memiliki variabel TMP (skenario default pada versi Windows terbaru), bukan?
PRMan
1
GetTempPathtetap bergantung pada variabel lingkungan Anda, jika Anda membaca dokumentasi kernel, sehingga saat pengguna Logman menunjukkan tidak ada alasan untuk tidak menggunakan GetEnvironmentVariable... mereka berdua memiliki kelemahan yang sama.
AnorZaken
22

Saya memiliki persyaratan yang sama - kami ingin meletakkan log di direktori root tertentu yang harus ada dalam lingkungan.

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

Jika saya ingin menggabungkan ini dengan sub-direktori, saya harus dapat menggunakannya Path.Combine( ... ).

The GetFolderPathmetode memiliki kelebihan untuk pilihan folder khusus yang memungkinkan Anda untuk mengontrol apakah jalan tertentu dibuat atau hanya diverifikasi.

Ekstrak
sumber
-8

mencoba

Environment.GetEnvironmentVariable("temp");
Ikke
sumber