2009-06-03 31 views
335

Hiện nay tôi đang sử dụng chức năng sau để có được đường dẫn thư mục tạm thời cho người dùng hiện tại:Làm thế nào để có được thư mục tạm thời cho người dùng hiện

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

Trên một số máy nó mang lại cho tôi đường dẫn thư mục tạm của người dùng hiện hành như:

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

Trên một số máy nó mang lại cho tôi hệ thống đường dẫn thư mục tạm thời như:

C: \ Windows \ TEMP

MSDN Documentation cũng nói rằng trên API trả về thư mục tạm thời hệ thống hiện tại của.

Có API khác có sẵn mà mang lại cho tôi đường dẫn hiện tại của người dùng tạm thời thư mục như thế này:

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

+2

Hành vi của System.Environment.GetEnvironmentVariable ("TEMP") giống với GetTempPath(). Trong máy của tôi cho tài khoản 'quản trị viên' cả API trả về "C: \ WINDOWS \ TEMP" nhưng đối với tài khoản 'Dịch vụ mạng' cả hai API trả về "C: \ Documents and Settings \ Network Service \ Local Settings \ Temp \". – Anoop

+1

Có lẽ tài khoản 'quản trị viên' có một thư mục tạm thời của C: \ Windows \ Temp thực sự? – Helen

+2

Có lý do cụ thể nào khiến bạn muốn nhận đường dẫn tạm thời trong C: \ Documents and Settings \ luôn không? – Noldorin

Trả lời

349

System.IO.Path.GetTempPath() chỉ là trình bao bọc cho cuộc gọi gốc tới GetTempPath(..) trong Kernel32.

Có một cái nhìn tại http://msdn.microsoft.com/en-us/library/aa364992(VS.85).aspx

sao chép từ trang đó:

Các GetTempPath chức năng kiểm tra cho sự tồn tại của các biến môi trường theo trình tự sau và sử dụng con đường đầu tiên được tìm thấy:

  • Đường dẫn được chỉ định bởi biến môi trường TMP.
  • Đường dẫn được chỉ định bởi biến môi trường TEMP.
  • Đường dẫn được chỉ định bởi biến môi trường USERPROFILE.
  • Thư mục Windows.

Nó không hoàn toàn rõ ràng với tôi cho dù "Thư mục Windows" có nghĩa là thư mục tạm thời dưới cửa sổ hoặc thư mục cửa sổ. Dumping temp tập tin trong thư mục cửa sổ chính nó âm thanh như một trường hợp không mong muốn, nhưng những người hiểu biết.

Vì vậy, kết hợp trang đó với bài đăng của bạn, tôi đoán rằng một trong các biến TMP, TEMP hoặc USERPROFILE cho người dùng Quản trị viên của bạn trỏ đến đường dẫn cửa sổ hoặc người khác không được đặt và đang dự phòng cửa sổ đường dẫn tạm thời.

+14

Biến môi trường 'TEMP' sẽ được đặt ở hai nơi: cho chính người dùng và cho máy cục bộ. Nếu nó không được thiết lập cho người dùng, thì một cái cho máy cục bộ sẽ được sử dụng, và nó luôn được thiết lập trong một cài đặt mặc định. Do đó, tìm kiếm thường dừng ở bước thứ hai. Trong thử nghiệm, nếu 'TMP',' TEMP' và 'USERPROFILE' đều không được đặt, nó thực sự * không * rơi trở lại'% SystemRoot% '(' 'C: \ Windows \' '). – Bob

+1

Mã được thực thi trong các Dịch vụ Windows chạy trong "Hệ thống cục bộ" hoặc trong các ứng dụng được khởi động bởi dịch vụ như vậy, cặp C: \ Windows \ Temp đôi khi được dùng làm thư mục termporary. – NineBerry

-5

thử

Environment.GetEnvironmentVariable("temp"); 
15

KHÔNG sử dụng:

System.Environment.GetEnvironmentVariable("TEMP") 

Biến môi trường có thể bị ghi đè, do đó biến số TEMP không nhất thiết phải là thư mục.

Cách chính xác là sử dụng System.IO.Path.GetTempPath() như trong câu trả lời được chấp nhận.

+32

@ImmortalBlue Vì đó không nhất thiết là thư mục tạm thời. Cách chính xác để lấy thư mục tạm thời là gọi 'System.IO.Path.GetTempPath()'. –

+6

Tôi biết điều này là khá cũ nhưng tôi figured tôi muốn để lại một lưu ý cho bất cứ ai tò mò: Không chỉ là nó không nhất thiết phải là thư mục tạm thời, như @ DavidLeffernan nói, nhưng bạn chỉ đơn giản là không có đầu mối những gì nó được. Trong khi không phải là một vấn đề với .NET, nó được coi là thực hành kém bởi vì bất kỳ người dùng độc hại nào cũng có thể thay đổi biến môi trường đó để khai thác chương trình của bạn. Nếu bạn đang chạy với đặc quyền quản trị và phần mềm độc hại có thể thay đổi mã của bạn khi thực thi, họ có thể, ví dụ, thực thi shellcode với tư cách quản trị viên vì nó được lưu trữ trong TEMP. – sraboy

+0

Có 2 sự khác biệt chính giữa 'GetEnvironmentVariable (" TEMP ")' và 'GetTempPath()'. 'GetTempPath()' kiểm tra đầu tiên cho biến "TMP" sau đó "TEMP" và cuối cùng là "USERPROFILE". Nếu không tìm thấy bất kỳ đường dẫn trả về của nó cho thư mục Windows. Nó cũng đảm bảo rằng nó trả về đường dẫn chính xác nhưng nó không đảm bảo rằng đường dẫn tồn tại. – Logman

17

Tôi có cùng yêu cầu này - chúng tôi muốn đặt nhật ký vào một thư mục gốc cụ thể cần tồn tại trong môi trường.

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

Nếu tôi muốn kết hợp điều này với một thư mục con, tôi có thể sử dụng Path.Combine(...).

Phương thức GetFolderPath có tình trạng quá tải cho các tùy chọn thư mục đặc biệt cho phép bạn kiểm soát xem đường dẫn được chỉ định đã được tạo hay chỉ được xác minh.

Các vấn đề liên quan