C # mendapatkan path dari% AppData%

387

C # 2008 SP1

Saya menggunakan kode di bawah ini:

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

Namun, saya mendapatkan pengecualian yang menunjuk ke lokasi dari mana aplikasi saya berjalan:

Tidak dapat menemukan bagian dari jalur 'D: \ Projects \ SubVersionProjects \ CatDialer \ bin \ Debug \% AppData% \ DateLinks.xml'.

Saya pikir %AppData%seharusnya menemukan jalan relatif. Ketika saya pergi Start|Run|%AppData%windows explorer membawa saya ke direktori itu.

Saya tidak bisa memasukkan path lengkap, karena pengguna berbeda pada setiap mesin klien.

ant2009
sumber

Jawaban:

802

Untuk mendapatkan direktori AppData , yang terbaik adalah menggunakan GetFolderPathmetode ini:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

(harus menambahkan using Systemjika tidak ada).

%AppData%adalah variabel lingkungan, dan mereka tidak secara otomatis diperluas di mana saja di. NET, meskipun Anda dapat secara eksplisit menggunakan Environment.ExpandEnvironmentVariablemetode untuk melakukannya. Saya masih akan sangat menyarankan agar Anda menggunakan GetFolderPath, karena seperti yang ditunjukkan oleh Johannes Rössel dalam komentar, %AppData%mungkin tidak diatur dalam keadaan tertentu.

Akhirnya, untuk membuat jalur seperti yang ditunjukkan pada contoh Anda:

var fileName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "DateLinks.xml");
Noldorin
sumber
45
+1 untuk menawarkan solusi nyata, tidak bergantung pada lingkungan. Untuk menambah jawaban: Tidak setiap fungsi yang menangani nama file memperluas variabel lingkungan. Bahkan, biasanya Anda harus melakukan ini secara eksplisit, jika tidak berhasil dan Anda akan berakhir dengan% sesuatu% folder. Selain itu, lingkungan tidak perlu ada, dalam beberapa kasus ketika menjalankan program di bawah akun pengguna lain, lingkungan pengguna tidak akan dimuat dan% Appdata% akan kosong. Itu sebabnya Anda ingin menggunakan API yang terdokumentasi untuk mendapatkan folder tersebut (kecuali Anda menggunakan file batch).
Joey
@ Johnannes: Info bagus di sana. Saya baru saja mengubah jawaban saya ketika Anda mempostingnya, tetapi saya akan membuatnya lebih jelas bahwa GetFolderPath jelas lebih disukai daripada ExpandEnvironmentVariable.
Noldorin
+1 untuk Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData), saya berada di belakang ini selama beberapa hari sekarang.
Sumit Ghosh
1
Untuk beberapa alasan Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)mengembalikan string kosong untuk saya (IIS 7, VS 2011). Masalah dipecahkan menggunakan solusi Simon_Weaver - pemetaan menggunakan MapPath.
Mike Keskinov
52
FYI yang memberikan direktori Roaming untuk AppData Environment lokal. DapatkanFolderPath (Environment.SpecialFolder.LocalApplicationData)
roundcrisis
49

Path berbeda jika Anda berbicara ASP.NET.

Saya tidak dapat menemukan nilai 'SpecialFolder' yang menunjuk ke / App_Data untuk ASP.NET.

Sebaliknya, Anda perlu melakukan ini:

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

(Catatan: Anda tidak memerlukan properti 'Lancar' di Kontroler MVC)

Jika ada cara lain yang lebih 'abstrak' untuk mencapai App_Dataakan senang mendengar bagaimana.

Simon_Weaver
sumber
Hanya sebuah catatan karena inti asp.net keluar sekarang. Pendekatan ini secara khusus bergantung pada IIS.
George Mauer
7
HostingEnvironment.MapPath(@"~/App_Data")lebih baik dan berfungsi dalam konteks MVC / WebAPI dan WCF di mana tidak ada HttpContext - tetapi tidak yakin tentang inti '
Simon_Weaver
37

Cara TERBAIK untuk menggunakan direktori AppData, IS untuk menggunakan Environment.ExpandEnvironmentVariablemetode.

Alasan:

  • itu menggantikan bagian dari string Anda dengan direktori yang valid atau apa pun
  • itu case-insensitive
  • itu mudah dan tidak rumit
  • itu adalah standar
  • bagus untuk berurusan dengan input pengguna

Contoh:

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

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

Ingat beberapa jenis pengguna %AppData%, beberapa %appdata%dan beberapa %APpData% Anda tidak ingin berakhir dengan:

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

Jika variabel lingkungan tidak disetel, itu bukan kesalahan Anda (selain saat itu IS ). Saya biasanya tidak memberitahu orang untuk tidak menemukan kembali roda tetapi setelah saya pertama kali pergi ke arah lain dan menyadari bahwa itu adalah ide yang buruk.

Bitterblue
sumber
Menyukai contoh pathvariabel Anda :)
RBT
+1 Environment.ExpandEnvironmentVariableadalah yang terbaik saat Anda hanya perlu melakukan ekspansi terlepas dari env vars mana yang mungkin ada di string path.
Blins
24

Anda juga bisa menggunakan

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

untuk memperluas %AppData%variabel.

sandaran
sumber
15

Di .net2.0 Anda bisa menggunakan variabel Application.UserAppDataPath

Nathan
sumber
20
Ini hanya WinForms.
7

Saya tidak berpikir menempatkan% AppData% dalam string seperti itu akan berhasil.

mencoba

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString()
danswain
sumber
4

Hanya ingin berbagi cara lain mengakses folder 'App_Data' di aplikasi mvc saya jika seseorang membutuhkan ini.

 Path.Combine(HttpRuntime.AppDomainAppPath,"App_Data")
cpoDesign
sumber
Mungkin bukan jawaban yang tepat, tetapi itulah yang saya cari. +1
Derrick
Bekerja untuk saya setelah mengganti tanda kutip tunggal dengan tanda kutip ganda. Path.Combine (HttpRuntime.AppDomainAppPath, "App_Data")
ajaysinghdav10d
1

Ini berfungsi untuk saya dalam aplikasi konsol -

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

Untuk ASP.NET, Load User Profilepengaturan perlu diatur pada kumpulan aplikasi tapi itu tidak cukup. Ada pengaturan tersembunyi bernama setProfileEnvironmentdalam \Windows\System32\inetsrv\Config\applicationHost.config, yang karena alasan tertentu dimatikan secara default, bukan pada seperti yang dijelaskan dalam dokumentasi . Anda dapat mengubah default atau mengaturnya di kumpulan aplikasi Anda. Semua metode di Environmentkelas kemudian akan mengembalikan nilai yang tepat.

MoonStom
sumber