Geçerli kullanıcı için geçici klasör alma


395

Şu anda geçerli kullanıcı için geçici klasör yolu almak için aşağıdaki işlevi kullanıyorum:

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

Bazı makinelerde bana şu anki kullanıcının geçici klasör yolunu verir:

C: \ Belgeler ve Ayarlar \ yönetici \ Yerel Ayarlar \ Temp \

Bazı makinelerde bana sistem geçici klasör yolu verir:

C: \ WINDOWS \ TEMP

MSDN Documentation, yukarıdaki API'nin geçerli sistemin geçici klasörünü döndürdüğünü de söylüyor.

Geçerli kullanıcının geçici klasör yolunu şu şekilde veren başka bir API var mı:

C: \ Belgeler ve Ayarlar \ yönetici \ Yerel Ayarlar \ Temp \


2
System.Environment.GetEnvironmentVariable ("TEMP") davranışı GetTempPath () ile aynıdır. Makinemde 'yönetici' hesabı için her iki API da "C: \ WINDOWS \ TEMP" döndürür, ancak "Network Service" hesabı için her iki API da "C: \ Documents and Settings \ Ağ Hizmeti \ Local Settings \ Temp \" döndürür.
Anoop

1
Belki de 'yönetici' hesabının C: \ Windows \ Temp geçici klasörü var?
Helen

2
Geçici yolu her zaman C: \ Documents and Settings \ altından almak istemenizin belirli bir nedeni var mı?
Noldorin

11
Bilginize: Eğer varsa do değil, kullanıcının (eğer kümesi) Environment.GetEnvironmentVariable ( "geçici", EnvironmentVariableTarget.Machine) kullanabilir sistem Temp klasörünü istiyorum
piers7

1
Geçmişte, geçici klasörleri sık sık kullandım ve temizleme işlemi olabildiğince disk tamamen tükenmediği sürece hiç umursamadım. Geçici kullanım için geçici bir klasörün noktası değil - önemsiz yer tutucu değil mi? Neden API tarafından bilinmiyor ve ele alınamıyor? Temp yerine yapılandırılabilir, iyi bilinen bir yer mi kullanmalısınız?
barrypicker

Yanıtlar:


405

System.IO.Path.GetTempPath()GetTempPath(..)Kernel32'de yapılan yerel bir arama için yalnızca bir sarıcıdır.

Http://msdn.microsoft.com/en-us/library/aa364992(VS.85).aspx adresine bir göz atın

Bu sayfadan kopyalandı:

GetTempPath işlevi ortam değişkenlerinin varlığını aşağıdaki sırayla denetler ve bulunan ilk yolu kullanır:

  • TMP ortam değişkeni tarafından belirtilen yol.
  • TEMP ortam değişkeni tarafından belirtilen yol.
  • USERPROFILE ortam değişkeni tarafından belirtilen yol.
  • Windows dizini.

"Windows dizini" nin pencerelerin altındaki temp dizini mi yoksa windows dizininin kendisi mi olduğu tamamen açık değil. Windows dizinindeki geçici dosyaları boşaltma istenmeyen bir durum gibi geliyor, ama kim bilir.

Bu sayfayı yazınızla birleştirdiğinizde, Yönetici kullanıcılarınız için TMP, TEMP veya USERPROFILE değişkenlerinden birinin windows yolunu gösterdiğini veya ayarlanmadığını ve windows temp yoluna bir geri dönüş aldığını tahmin ediyorum.


14
TEMPÇevre değişkeni iki yerde ayarlanmış: Kullanıcı kendisi için ve yerel makine için. Kullanıcı için ayarlanmamışsa, yerel makine için ayarlanamaz ve bu her zaman varsayılan kurulumda ayarlanır. Bu nedenle arama genellikle ikinci adımda durur. Eğer test edilmesinde TMP, TEMPve USERPROFILEtüm unset, aslında yaptığı için sonbahar arka %SystemRoot%( C:\Windows\).
Bob

1
"Yerel Sistem" altında çalışan Windows Hizmetlerinde veya böyle bir hizmet tarafından başlatılan uygulamalarda yürütülen kod, C: \ Windows \ Temp klasörü bazen termporary klasörü olarak kullanılır.
NineBerry

1
\ TEMP 'Ama onların örnek aslında bir ters eğik çizgi ile bitmez: "ters eğik çizgi ile döndü dize uçları, örneğin,' C: sizin bağlantıdan belgelerine bu diyor..
dcp

Uygulamanızda bu işlevin döndürdüğü yola yazma izniniz olacağı garanti edilmez. Bunun yerine IsolatedStorage'ı denerseniz ne olur?
John

35

Bunu KULLANMAYIN :

System.Environment.GetEnvironmentVariable("TEMP")

Ortam değişkenleri geçersiz kılınabilir, bu nedenle TEMPdeğişken mutlaka dizin değildir.

Doğru yol, System.IO.Path.GetTempPath()kabul edilen cevaptaki gibi kullanmaktır .


34
@ImmortalBlue Çünkü bu geçici dizin olmak zorunda değildir. Temp dizinini almanın doğru yolu aramaktır System.IO.Path.GetTempPath().
David Heffernan

9
Biliyorum bu oldukça eski ama meraklı herkes için bir not bırakacağımı düşündüm: @DavidHeffernan'ın söylediği gibi sadece geçici dizin değil, aynı zamanda ne olduğu hakkında hiçbir fikriniz yok. .NET ile ilgili bir sorun kadar olmasa da, kötü niyetli bir uygulama olarak kabul edilir, çünkü kötü niyetli herhangi bir kullanıcı programınızdan yararlanmak için bu ortam değişkenini değiştirmiş olabilir. Yönetici ayrıcalıklarıyla çalışıyorsanız ve kötü amaçlı yazılım, kodunuzu yürütülürken değiştirebilirse, örneğin, TEMP'te depolandığından kabuk kodunu yönetici olarak yürütebilirler.
sraboy

GetEnvironmentVariable("TEMP")Ve arasında 2 ana fark vardır GetTempPath(). GetTempPath()önce "TMP" değişkeni, sonra "TEMP" ve son olarak "USERPROFILE" olup olmadığını kontrol eder. Bunlardan herhangi birini bulamazsanız, Windows klasörüne geri dönüş yolu. Ayrıca, doğru yolu döndürdüğünü garanti eder, ancak yolun var olduğunu garanti etmez.
Logman

Ancak, TMP değişkeniniz (son Windows sürümlerinde varsayılan senaryo) yoksa kabul edilen yanıt tam olarak bunu yapar, değil mi?
PRMan

1
GetTempPathÇekirdek belgelerini okuduysanız, yine de ortam değişkenlerinize güvenir, böylece kullanıcı Logman'ın kullanmamasının bir nedeni yoktur GetEnvironmentVariable... ikisi de aynı zayıflığa sahiptir.
AnorZaken

22

Aynı gereksinim var - günlükleri ortam içinde olması gereken belirli bir kök dizine koymak istiyorum.

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

Bunu bir alt dizinle birleştirmek istersem kullanabilmeliyim Path.Combine( ... ).

GetFolderPathYöntem, belirtilen yol oluşturulan veya basitçe doğrulanabilir olup olmadığını kontrol etmenizi sağlar özel klasör seçenekleri için bir aşırı vardır.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.