วิธีรับโฟลเดอร์ชั่วคราวสำหรับผู้ใช้ปัจจุบัน


395

ขณะนี้ฉันใช้ฟังก์ชันต่อไปนี้เพื่อรับเส้นทางโฟลเดอร์ชั่วคราวสำหรับผู้ใช้ปัจจุบัน:

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

ในบางเครื่องมันทำให้ฉันเส้นทางโฟลเดอร์ชั่วคราวของผู้ใช้ปัจจุบันเช่น:

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

ในบางเครื่องมันทำให้ฉันเส้นทางระบบโฟลเดอร์ชั่วคราวเช่น:

C: \ Windows \ TEMP

เอกสาร MSDN ยังกล่าวว่า API ด้านบนจะส่งคืนโฟลเดอร์ชั่วคราวของระบบปัจจุบัน

มี API อื่น ๆ ที่ให้เส้นทางโฟลเดอร์ชั่วคราวของผู้ใช้ปัจจุบันกับฉันเช่นนี้หรือไม่:

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


2
พฤติกรรมของ System.Environment.GetEnvironmentVariable ("TEMP") เหมือนกับ GetTempPath () ในเครื่องของฉันสำหรับบัญชี 'ผู้ดูแลระบบ' ทั้ง API จะส่งกลับ "C: \ WINDOWS \ TEMP" แต่สำหรับบัญชี 'บริการเครือข่าย' ทั้ง API จะส่งกลับ "C: \ Documents และ Settings \ Network Service \ Local Settings \ Temp \"
Anoop

1
บางทีบัญชี 'ผู้ดูแลระบบ' มีโฟลเดอร์ชั่วคราวของ C: \ Windows \ Temp จริงหรือ
เฮเลน

2
มีเหตุผลใดที่ทำให้คุณต้องการเส้นทางชั่วคราวภายใต้ C: \ Documents และ Settings \ always หรือไม่
Noldorin

11
FYI: ถ้าคุณไม่ต้องการที่โฟลเดอร์ระบบชั่วคราวที่ไม่ได้ของผู้ใช้ (ถ้าชุด) คุณสามารถใช้ Environment.GetEnvironmentVariable ( "ชั่วคราว" EnvironmentVariableTarget.Machine)
piers7

1
ในอดีตฉันเคยใช้โฟลเดอร์ temp บ่อยครั้งและไม่เคยสนใจว่าจะอยู่ที่ไหนตราบใดที่การล้างข้อมูลสามารถเกิดขึ้นได้ จุดประสงค์ของโฟลเดอร์ชั่วคราวสำหรับการใช้งานชั่วคราวไม่ใช่ตัวยึดตำแหน่งขยะหรือไม่ ทำไม API จึงไม่รู้จักและจัดการไม่ได้ คุณควรใช้ตำแหน่งที่กำหนดค่าได้ซึ่งเป็นที่รู้จักกันดีแทนอุณหภูมิ
barrypicker

คำตอบ:


405

System.IO.Path.GetTempPath()เป็นเพียง wrapper สำหรับการโทรแบบดั้งเดิมไปยังGetTempPath(..)ใน Kernel32

ดูที่http://msdn.microsoft.com/en-us/library/aa364992(VS.85).aspx

คัดลอกจากหน้านั้น:

ฟังก์ชัน GetTempPath ตรวจสอบการมีอยู่ของตัวแปรสภาพแวดล้อมตามลำดับต่อไปนี้และใช้พา ธ แรกที่พบ:

  • พา ธ ที่ระบุโดยตัวแปรสภาวะแวดล้อม TMP
  • เส้นทางที่ระบุโดยตัวแปรสภาพแวดล้อม TEMP
  • พา ธ ที่ระบุโดยตัวแปรสภาวะแวดล้อม USERPROFILE
  • ไดเรกทอรี Windows

ไม่ชัดเจนสำหรับฉันว่า "ไดเรกทอรี Windows" หมายถึงไดเรกทอรีชั่วคราวภายใต้ windows หรือไดเรกทอรี windows เอง การดัมพ์ไฟล์ temp ในไดเรกทอรี windows นั้นฟังดูเหมือนเป็นกรณีที่ไม่พึงประสงค์ แต่ใครจะรู้

ดังนั้นเมื่อรวมหน้านั้นกับโพสต์ของคุณฉันจะเดาว่าเป็นหนึ่งในตัวแปร TMP, TEMP หรือ USERPROFILE สำหรับผู้ใช้ที่เป็นผู้ดูแลระบบของคุณชี้ไปที่เส้นทางของ windows หรือไม่ได้ตั้งค่าไว้


14
TEMPตัวแปรสภาพแวดล้อมจะตั้งอยู่ในสถานที่สอง: สำหรับผู้ใช้ของตัวเองและสำหรับเครื่องท้องถิ่น หากไม่ได้ตั้งค่าไว้สำหรับผู้ใช้จะใช้งานเครื่องหนึ่งเครื่องและตั้งค่าไว้ในการติดตั้งเริ่มต้นเสมอ ดังนั้นการค้นหามักจะหยุดในขั้นตอนที่สอง ในการทดสอบถ้าTMP, TEMPและUSERPROFILEทุกคนไม่มีการตั้งค่าก็จริงไม่ถอยกลับไป%SystemRoot%( C:\Windows\)
Bob

1
รหัสที่ดำเนินการใน Windows Services ที่ทำงานภายใต้ "Local System" หรือในแอปพลิเคชันที่เริ่มต้นโดยบริการดังกล่าวบางครั้งโฟลเดอร์ 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()วิธีที่ถูกต้องที่จะได้รับไดเรกทอรีชั่วคราวคือการโทร
David Heffernan

9
ฉันรู้ว่ามันค่อนข้างเก่า แต่ฉันคิดว่าฉันจะทิ้งโน้ตไว้สำหรับใครก็ตามที่อยากรู้อยากเห็น: ไม่เพียง แต่มันไม่จำเป็นต้องเป็นไดเรกทอรีชั่วคราวตามที่ @DavidHeffernan พูด แต่คุณก็ไม่รู้ว่ามันคืออะไร แม้ว่าจะไม่เป็นปัญหากับ. NET มากนัก แต่ก็ถือว่าเป็นแนวปฏิบัติที่ไม่ดีเนื่องจากผู้ใช้ที่ประสงค์ร้ายอาจแก้ไขตัวแปรสภาพแวดล้อมนั้นเพื่อใช้ประโยชน์จากโปรแกรมของคุณ หากคุณใช้งานด้วยสิทธิ์ผู้ดูแลระบบและมัลแวร์สามารถเปลี่ยนรหัสของคุณในขณะที่กำลังดำเนินการตัวอย่างเช่นพวกเขาสามารถดำเนินการ shellcode เป็นผู้ดูแลระบบเพราะมันถูกเก็บไว้ใน TEMP
sraboy

มี 2 ความแตกต่างที่สำคัญระหว่างมีและGetEnvironmentVariable("TEMP") ตรวจสอบตัวแปร "TMP" ก่อนจากนั้นเลือก "TEMP" และสุดท้าย "USERPROFILE" หากไม่พบเส้นทางกลับสู่โฟลเดอร์ Windows นอกจากนี้ยังรับประกันว่าจะส่งคืนเส้นทางที่ถูกต้อง แต่ไม่รับประกันว่าเส้นทางนั้นมีอยู่ GetTempPath()GetTempPath()
Logman

แต่นี่เป็นสิ่งที่คำตอบที่ยอมรับจะทำถ้าคุณไม่มีตัวแปร TMP (สถานการณ์เริ่มต้นสำหรับ Windows รุ่นล่าสุด) ใช่ไหม
PRMan

1
GetTempPathถ้าคุณอ่านเอกสารเกี่ยวกับเคอร์เนลดังนั้นเมื่อผู้ใช้ Logman ชี้ให้เห็นว่าไม่มีเหตุผลที่จะไม่ใช้GetEnvironmentVariable... พวกเขาทั้งคู่มีจุดอ่อนเดียวกัน
AnorZaken

22

ฉันมีความต้องการเดียวกันนี้ - เราต้องการใส่บันทึกในไดเรกทอรีรากเฉพาะที่ควรมีอยู่ในสภาพแวดล้อม

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

ถ้าผมต้องการที่จะรวมนี้กับไดเรกทอรีย่อย, Path.Combine( ... )ฉันควรจะสามารถที่จะใช้

GetFolderPathวิธีมีเกินสำหรับตัวเลือกโฟลเดอร์พิเศษซึ่งช่วยให้คุณควบคุมไม่ว่าจะเป็นเส้นทางที่ระบุถูกสร้างขึ้นหรือตรวจสอบเพียง


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.