Saya perlu menulis file di folder yang sama di mana konsol ClickOnce .application
(file yang dapat dieksekusi) berada. Folder tempat peluncurannya.
Saya mencoba menggunakan Application.StartupPath
& Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
tetapi path menunjuk ke subfolder di bawah c:\Documents & Settings
. Bagaimana cara mendapatkan jalur tempat .application
tinggal?
Betul sekali.
ClickOnce applications
dipasang di bawah profil pengguna yang menginstalnya. Apakah Anda mengambil jalur yang mengambil informasi dari majelis pelaksana memberi Anda, dan pergi memeriksanya?Di windows Vista dan Windows 7, Anda akan menemukan cache ClickOnce di sini:
Pada Windows XP, Anda akan menemukannya di sini:
sumber
ApplicationDeployment.CurrentDeployment.ActivationUri mungkin berfungsi
"String nol-panjang jika properti TrustUrlParameters dalam manifes penyebaran salah, atau jika pengguna telah memasok UNC untuk membuka penyebaran atau telah membukanya secara lokal. Jika tidak, nilai kembali adalah URL lengkap yang digunakan untuk meluncurkan aplikasi, termasuk parameter apa pun. "
TETAPI yang saya pikir Anda inginkan adalah ApplicationDeployment.CurrentDeployment.DataDirectory yang memberi Anda folder tempat Anda dapat menulis data. Saat Anda memperbarui aplikasi, Anda akan kehilangan apa yang ada di folder .exe asli, tetapi Anda dapat memindahkan direktori data ke versi aplikasi yang baru. Aplikasi Anda dapat menulis ke folder ini dengan file log apa pun yang dimilikinya - dan saya cukup yakin aplikasi ini dijamin dapat ditulis.
sumber
Saya menggunakan
Assembly.GetExecutingAssembly().Location
untuk mendapatkan path keClickOnce
aplikasi yang digunakan di .Net 4.5.1.Namun, Anda tidak boleh menulis ke folder mana pun di mana aplikasi Anda digunakan, terlepas dari metode penyebaran (xcopy, ClickOnce, InstallShield, apa pun) karena itu biasanya hanya dibaca untuk aplikasi, terutama di versi Windows yang lebih baru dan lingkungan server.
Aplikasi harus selalu menulis ke folder yang disediakan untuk tujuan tersebut. Anda bisa mendapatkan folder yang Anda butuhkan mulai dari Enumeration Environment.SpecialFolder Khusus. Halaman MSDN menjelaskan untuk setiap folder: http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx
Yaitu untuk data, log dan file lain yang dapat digunakan
ApplicationData
(roaming),LocalApplicationData
(lokal) atauCommonApplicationData
. Untuk file sementara gunakanPath.GetTempPath
atauPath.GetTempFileName
.Pekerjaan di atas juga pada server dan desktop.
EDIT:
Assembly.GetExecutingAssembly()
dipanggil dalam executable utama.sumber
Aplikasi ClickOnce DO tinggal di sebuah subdirektori dari C: \ Documents & Settings. Mereka tidak memiliki direktori instalasi "bersih" karena file-file lokal pada dasarnya "sementara" diunduh untuk memungkinkan aplikasi berjalan pada PC lokal dan eksekusi aplikasi dikendalikan dari server ClickOnce tempat mereka digunakan tergantung pada pengaturan penerbitan (Memeriksa pembaruan, persyaratan versi, dll).
sumber
Inilah yang saya temukan yang berfungsi untuk bisa mendapatkan lokasi folder yang digunakan dari aplikasi clickonce saya dan yang belum disebutkan di mana pun saya lihat dalam pencarian saya, untuk skenario yang mirip dan spesifik:
Berikut ini adalah visual dari use case saya:
Saya tidak menemukan saran dalam pertanyaan ini atau komentar mereka untuk mengembalikan folder tempat aplikasi clickonce digunakan (bahwa saya kemudian akan bergerak relatif ke folder ini untuk menemukan folder yang menarik). Tidak ada pencarian internet lain atau pertanyaan SO terkait yang menghasilkan jawaban.
Semua properti yang disarankan gagal karena objek (misalnya ActivationUri) menjadi nol, atau menunjuk ke folder aplikasi yang diinstal dalam cache PC lokal. Ya, saya dapat menangani objek null dengan anggun dengan memeriksa IsNetworkDeployed - itu bukan masalah - tetapi anehnya IsNetworkDeployed mengembalikan false walaupun saya sebenarnya memiliki lokasi folder yang dikerahkan jaringan untuk aplikasi clickonce. Ini karena aplikasi dijalankan dari bit cache lokal.
Solusinya adalah dengan melihat:
AppDomain.CurrentDomain.BaseDirectory
ketika aplikasi sedang dijalankan di dalam studio visual seperti yang saya kembangkan danSystem.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
ketika dijalankan secara normal.System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
dengan benar mengembalikan direktori jaringan tempat aplikasi clickonce saya digunakan, dalam semua kasus. Yaitu, ketika diluncurkan melalui:Berikut kode yang saya gunakan saat startup aplikasi untuk mendapatkan path dari folder WorkAccounts. Mendapatkan folder aplikasi yang dikerahkan itu sederhana dengan tidak berbaris ke direktori induk:
sumber
Dengan asumsi pertanyaannya adalah tentang mengakses file di folder aplikasi setelah ClickOnce (true == System.Deployment.ApplicationDeploy.IsNetworkDeployed) aplikasi diinstal pada PC pengguna, mereka adalah tiga cara untuk mendapatkan folder ini oleh aplikasi itu sendiri:
Ini bekerja dari VS IDE dan dari aplikasi ClickedOnce yang digunakan / diinstal, tidak ada "true == System.Deployment.ApplicationDeploy.IsNetworkDeployed" yang diperlukan. ClickOnce mengambil semua file yang termasuk dalam proyek Visual Studio 2017 sehingga aplikasi dapat mengakses semua dan semua file yang dikerahkan menggunakan jalur relatif dari dalam aplikasi.
Ini didasarkan pada Windows 10 dan Visual Studio 2017
sumber