Cách nhận thư mục tạm thời cho người dùng hiện tại


395

Hiện tại tôi đang sử dụng chức năng sau để lấy đường dẫn thư mục tạm thời cho người dùng hiện tại:

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

Trên một số máy, nó cung cấp cho tôi đường dẫn thư mục tạm thời của người dùng hiện tại như:

C: \ Tài liệu và Cài đặt \ quản trị viên \ Cài đặt cục bộ \ Temp \

Trên một số máy, nó cung cấp cho tôi đường dẫn thư mục tạm thời của hệ thống như:

C: \ Windows \ TEMP

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

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

C: \ Tài liệu và Cài đặt \ quản trị viên \ Cài đặt cục bộ \ Temp \


2
Hành vi của System.En Môi.GetEn MôiVariable ("TEMP") giống như 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ả API trả về "C: \ Documents và Cài đặt \ Dịch vụ mạng \ Cài đặt cục bộ \ Temp \".
Anoop

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

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

11
FYI: nếu bạn làm muốn vào thư mục hệ thống tạm thời, không phải là của người dùng (nếu thiết lập), bạn có thể sử dụng Environment.GetEnvironmentVariable ( "tạm thời", EnvironmentVariableTarget.Machine)
piers7

1
Trước đây, tôi đã sử dụng các thư mục tạm thời thường xuyên và không bao giờ quan tâm đến nó ở đâu, miễn là việc dọn dẹp có thể xảy ra để đĩa không bị tiêu hao hoàn toàn. Không phải là điểm của một thư mục tạm thời để sử dụng tạm thời - giữ chỗ rác? Tại sao nó không thể được biết và xử lý bởi API? Bạn có nên sử dụng một vị trí có thể cấu hình, nổi tiếng thay vì tạm thời?
barrypicker

Câu trả lời:


405

System.IO.Path.GetTempPath()chỉ là một trình bao bọc cho một cuộc gọi riêng đến GetTempPath(..)trong Kernel32.

Hãy xem http://msdn.microsoft.com/en-us/l Library / aa364992 (VS85) .aspx

Sao chép từ trang đó:

Hàm GetTempPath kiểm tra sự tồn tại của các biến môi trường theo thứ tự sau và sử dụng đường dẫn đầ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.

Tôi không hoàn toàn rõ ràng liệu "Thư mục Windows" có nghĩa là thư mục tạm thời dưới cửa sổ hay chính thư mục windows. Việc đổ các tệp tạm thời trong thư mục windows có vẻ như là một trường hợp không mong muốn, nhưng ai biết được.

Vì vậy, kết hợp trang đó với bài đăng của bạn, tôi sẽ đ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ổ, nếu không, chúng sẽ không được đặt và đường dẫn dự phòng cho đường dẫn tạm thời của cửa sổ.


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

1
Mã được thực thi trong Windows Services chạy trong "Hệ thống cục bộ" hoặc trong các ứng dụng được khởi động bởi một dịch vụ như vậy, thư mục C: \ Windows \ Temp đôi khi được sử dụng làm thư mục thuật ngữ.
Nine tweet

1
Tài liệu từ liên kết của bạn nói rằng: "Chuỗi trả về kết thúc bằng dấu gạch chéo ngược, ví dụ:" C: \ TEMP ". Nhưng ví dụ của họ không thực sự kết thúc bằng dấu gạch chéo ngược.
dcp

Bạn không được đảm bảo rằng bạn sẽ có quyền viết thư cho đường dẫn được trả về bởi hàm đó trong ứng dụng của bạn. Thay vào đó, nếu bạn đã thử cách ly thay thế?
Giăng

35

KHÔNG sử dụng cái này:

System.Environment.GetEnvironmentVariable("TEMP")

Biến môi trường có thể được ghi đè, vì vậy TEMPbiến không nhất thiết 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.


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

9
Tôi biết điều này khá cũ nhưng tôi nghĩ rằng tôi sẽ để lại một lưu ý cho bất kỳ ai tò mò: Không chỉ là nó không nhất thiết là thư mục tạm thời, như @DavidHeffernan nói, mà đơn giản là bạn không biết nó là gì. Mặc dù không có nhiều vấn đề với .NET, nhưng nó được coi là thực tiễn kém 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ị viên và phần mềm độc hại có thể thay đổi mã của bạn khi thực thi, ví dụ, họ có thể thực thi shellcode với tư cách quản trị viên vì nó được lưu trữ trong TEMP.
sraboy

Có 2 sự khác biệt chính giữa GetEnvironmentVariable("TEMP")GetTempPath(). GetTempPath()đầu tiên kiểm tra 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 nào trả về đường dẫn đến 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

Nhưng đây chính xác là câu trả lời được chấp nhận nếu bạn không có biến TMP (kịch bản mặc định trên các phiên bản Windows gần đây), phải không?
PRman

1
GetTempPathDù sao cũng phụ thuộc vào các biến môi trường của bạn, nếu bạn đọc tài liệu kernel, vì vậy người dùng Logman chỉ ra rằng không có lý do gì để không sử dụng GetEnvironmentVariable... cả hai đều có cùng một điểm yếu.
AnorZaken

22

Tôi có cùng yêu cầu này - chúng tôi muốn đặt các bản ghi trong 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 sẽ có thể sử dụng Path.Combine( ... ) .

Các GetFolderPathphương pháp có một 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 con đường cụ thể được tạo ra hoặc đơn giản là xác minh.


-8

thử

Environment.GetEnvironmentVariable("temp");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.