C #% AppData% yolunu alma


387

C # 2008 SP1

Aşağıdaki kodu kullanıyorum:

dt.ReadXml("%AppData%\\DateLinks.xml");

Ancak, uygulamamın çalıştığı yere işaret eden bir istisna alıyorum:

'D: \ Projects \ SubVersionProjects \ CatDialer \ bin \ Debug \% AppData% \ DateLinks.xml' yolunun bir parçası bulunamadı.

%AppData%Göreceli yolu bulması gerektiğini düşündüm . Gittiğimde Start|Run|%AppData%windows explorer beni o dizine götürüyor.

Kullanıcı her istemci makinede farklı olduğu için tam yolu giremiyorum.

Yanıtlar:


802

AppData dizinini almak için , GetFolderPathyöntemi kullanmak en iyisidir :

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

(eklemeli using System yoksa ).

%AppData%bir ortam değişkenidir ve Environment.ExpandEnvironmentVariablebunu yapmak için yöntemi açıkça kullanabilmenize rağmen, .NET'in hiçbir yerinde otomatik olarak genişletilmezler . Hala kullanmanızı şiddetle tavsiye ediyorumGetFolderPath , çünkü Johannes Rössel yorumda belirtildiği gibi, %AppData%bazı durumlarda ayarlanamayabilir.

Son olarak, örneğinizde gösterildiği gibi yol oluşturmak için:

var fileName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "DateLinks.xml");

45
Çevreye güvenmeden gerçek bir çözüm sunmak için +1. Cevaba eklemek için: Dosya adlarını işleyen her işlev ortam değişkenlerini genişletmez. Aslında, genellikle bunu açıkça yapmanız gerekir, aksi takdirde işe yaramaz ve% bir şey% klasörler ile sonuçlanır. Ayrıca, ortamın bulunmasına gerek yoktur, bazı durumlarda başka bir kullanıcı hesabı altında bir program çalıştırılırken kullanıcının ortamı yüklenmez ve% Appdata% boş olur. Bu nedenle, bu klasörleri almak için belgelenmiş API'ları kullanmak istersiniz (toplu dosyaları kullanmıyorsanız).
Joey

@Johannes: İyi bilgi var. Bunu gönderdiğin zaman cevabımı değiştirdim, ancak GetFolderPath'in ExpandEnvironmentVariable'a göre kesinlikle tercih edildiğini daha net hale getireceğim.
Noldorin

+ 1 için Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData), şimdi birkaç gün boyunca bunun arkasındaydım.
Sumit Ghosh

1
Nedense Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)benim için boş bir dize döndürür (IIS 7, VS 2011). Simon_Weaver çözümü - haritalama kullanılarak çözüldü MapPath.
Mike Keskinov

52
Yerel AppData Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData) için Roaming dizinini veren FYI
roundcrisis

49

ASP.NET'ten bahsediyorsanız yol farklıdır.

ASP.NET için / App_Data işaret 'SpecialFolder' değer bulamadı.

Bunun yerine bunu yapmanız gerekir:

 HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data")  

(Not: Bir MVC Denetleyicide 'Current' özelliğine ihtiyacınız yoktur)

Eğer bir başka 'soyut' yol daha varsa App_Datanasıl duymak isterim.


Sadece asp.net çekirdeğinden beri bir not çıkıyor. Bu yaklaşım özellikle IIS'ye dayanmaktadır.
George Mauer

7
HostingEnvironment.MapPath(@"~/App_Data")Daha iyi ve HttpContext olmayan MVC / WebAPI ve WCF bağlamlarında çalışıyor - ama çekirdek hakkında emin değilim
Simon_Weaver

37

AppData dizinini kullanmak için en iyi yol, IS kullanmaktırEnvironment.ExpandEnvironmentVariable yöntemini .

Nedenleri:

  • dizenizin bölümlerini geçerli dizinlerle veya başka herhangi bir şeyle değiştirir
  • büyük / küçük harfe duyarlı değildir
  • kolay ve karmaşık değil
  • bu bir standart
  • kullanıcı girişi ile uğraşmak için iyi

Örnekler:

string path;
path = @"%AppData%\stuff";
path = @"%aPpdAtA%\HelloWorld";
path = @"%progRAMfiLES%\Adobe;%appdata%\FileZilla"; // collection of paths

path = Environment.ExpandEnvironmentVariables(path);
Console.WriteLine(path);

Bazı kullanıcıların yazdıklarını %AppData%, bazılarını %appdata%ve bazılarını hatırlamak %APpData% istemezsiniz:

if (path.ToLower().StartsWith("%appdata%"))
    ; // path manipulation
if (path.ToLower().StartsWith("%programfiles%"))
    ; // path manipulation

Ortam değişkeni ayarlanmamışsa, bu sizin hatanız değildir ( IS'nin yanı sıra ). Genellikle insanlara söyleme değil ben ilk diğer tarafa gitti ve bunun kötü bir fikir olduğunu fark-re icat tekerlek ama sonra.


pathDeğişken örneklerinizi
beğendim

Environment.ExpandEnvironmentVariableYol dizesinde hangi env değişkenlerinden bağımsız olarak genişletmeniz gerektiğinde +1 en iyisidir.
16'da karıştırır

24

Ayrıca kullanabilirsiniz

Environment.ExpandEnvironmentVariables("%AppData%\\DateLinks.xml");

%AppData%değişkeni genişletmek için .


15

.Net2.0'da değişkeni kullanabilirsiniz Application.UserAppDataPath


20
Bu sadece Winforms.

7

Böyle bir dize% AppData% koyarak düşünmek işe yaramaz.

Deneyin

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString()

4

Birisinin buna ihtiyacı olması durumunda benim mvc uygulamamda 'App_Data' klasörüne erişmenin başka bir yolunu paylaşmak istedim.

 Path.Combine(HttpRuntime.AppDomainAppPath,"App_Data")

Doğru cevap olmayabilir, ama aradığım şey buydu. +1
Derrick

Tek tırnak çift tırnak ile değiştirildikten sonra benim için çalıştı. Path.Combine (HttpRuntime.AppDomainAppPath, "App_Data")
ajaysinghdav10d

1

Bu benim için bir konsol uygulamasında çalışıyor -

string appData = System.Environment.GetEnvironmentVariable("APPDATA");

1

ASP.NET için, Load User Profileayarın uygulama havuzunda ayarlanması gerekir, ancak bu yeterli değildir. Adlı bir gizli ayar yoktur setProfileEnvironmentiçinde \Windows\System32\inetsrv\Config\applicationHost.confignedense yerine anlatıldığı gibi üzerine değil, varsayılan olarak kapalıdır, dokümantasyon . Varsayılanı değiştirebilir veya uygulama havuzunuzda ayarlayabilirsiniz. EnvironmentSınıftaki tüm yöntemler daha sonra uygun değerleri döndürü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.