ClickOnce uygulaması için klasör yolu nasıl alınır


160

Bir konsol ClickOnce .application(yürütülebilir dosya) bulunduğu aynı klasöre bir dosya yazmak gerekiyor . Başlatıldığı klasör.

Kullanmayı denedim Application.StartupPath& Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ama yol altında bir alt klasöre işaret ediyor c:\Documents & Settings. .applicationİkamet ettiği yolu nasıl alabilirim ?

Yanıtlar:


253

Klasör konumunu bulmak için uygulamayı çalıştırabilir, görev yöneticisini (CTRL-SHIFT-ESC) açabilir, uygulamayı seçebilir ve | Dosya konumunu aç'ı sağ tıklayabilirsiniz.


3
hey, profesyonel ipucu! ancak eski boktan XP makinelerde mevcut değildir. :)
Jalal

5
@ "Eski bok makineleri" için Jalal www.SysInternals.com adresine gidin ve Process Explorer'ı indirin. Win7'nin TaskManager'ındaki değişikliklerden şüpheleniyorum ve daha sonra Win8 bundan kopyalandı.
Arioch '

1
Müşterinin bilgisayarında çalışan uygulamanızda bunu nasıl başarıyorsunuz?
user3285954

2
Uygulamayı çaresizce ihtiyacım olan bir günlük dosyasını sileceği için çalıştıramazsam ne olur?
Tomáš Zato - Monica'yı eski durumuna döndür

2
@Tony_Henrich bunu doğru cevap olarak işaretlemelisin
sparkyShorts

120

yol c: \ Documents & Settings altındaki bir alt klasöre işaret ediyor

Doğru. ClickOnce applicationsbunları yükleyen kullanıcının profili altında yüklenir. Yürütme derlemesinden bilgi almanın yolunu aldınız ve gidip bakın mı?

Windows Vista ve Windows 7'de, ClickOnce önbelleğini burada bulabilirsiniz:

c:\users\username\AppData\Local\Apps\2.0\obfuscatedfoldername\obfuscatedfoldername

Windows XP'de, burada bulabilirsiniz:

C:\Documents and Settings\username\LocalSettings\Apps\2.0\obfuscatedfoldername\obfuscatedfoldername

1
Bütün bunları anlıyorum. Uygulamayı tıkladığım klasörü istiyorum. C: \ Documents and Settings'e erişimim yok, bu nedenle bu işlev tarafından döndürülen klasör yolunu kullanacaksam günlük dosyasına erişemeyeceğim ve sabit kodlanmış yol değerleri kullanmak istemiyorum .
Tony_Henrich

25

ApplicationDeployment.CurrentDeployment.ActivationUri işe yarayabilir

"Dağıtım bildirimindeki TrustUrlParameters özelliği yanlışsa veya kullanıcı, dağıtımı açmak için bir UNC sağladıysa veya yerel olarak açtıysa, sıfır uzunlukta bir dize. Aksi takdirde, dönüş değeri uygulamayı başlatmak için kullanılan tam URL'dir, herhangi bir parametre dahil. "


ANCAK gerçekten istediğinizi düşünüyorum size veri yazabilirsiniz bir klasör verir ApplicationDeployment.CurrentDeployment.DataDirectory olduğunu. Uygulamayı yine de güncellediğinizde, orijinal .exe klasöründe bulunanları kaybedersiniz, ancak veri dizinini uygulamanın yeni bir sürümüne taşıyabilirsiniz. Uygulamanız, sahip olduğu günlük dosyalarıyla bu klasöre yazabilir - ve yazılabilir olacağından eminim.


Hiçbir şey yapmadım, ancak eski DataDirectory dosyaları dağıtımdan sonra otomatik olarak yeni DataDirectory'ye kopyalanır. .Pre dizini de yoktur. (.NET Framework 3.5 ve 4.5)
Der_Meister

15

.Net 4.5.1'de dağıtılmış bir uygulamanın Assembly.GetExecutingAssembly().Locationyolunu almak için kullanıyorum ClickOnce.

Ancak, dağıtım yönteminden (xcopy, ClickOnce, InstallShield, herhangi bir şey) bağımsız olarak, uygulamanızın dağıtıldığı hiçbir klasöre yazmamalısınız, çünkü bunlar genellikle yalnızca yeni Windows sürümlerinde ve sunucu ortamlarında uygulamalar için okunur.

Bir uygulama her zaman bu gibi amaçlar için ayrılmış klasörlere yazmalıdır. İhtiyacınız olan klasörleri Environment.SpecialFolder Numaralandırma'dan başlayarak alabilirsiniz. MSDN sayfasında her klasörün ne için olduğu açıklanmaktadır: http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx

Yani veri, günlük ve diğer dosyalar için ApplicationData(dolaşım), LocalApplicationData(yerel) veya CommonApplicationData. Geçici dosyalar için Path.GetTempPathveya kullanın Path.GetTempFileName.

Yukarıdaki sunucular ve masaüstleri üzerinde de çalışır.

EDIT: Assembly.GetExecutingAssembly()ana yürütülebilir dosyada çağrılır.


Bu benim için bir ClickOnce uygulaması için çalışıyor, aynı zamanda hata ayıklama sırasında VS dev ortamında çalışıyor.
Developer63

3

ClickOnce uygulamaları DO C alt dizinde: \ Documents & Settings. Yerel dosyalar, uygulamanın yerel bilgisayarda çalışmasına izin vermek için esas olarak "geçici olarak" indirildiği ve uygulamanın yürütülmesinin yayınlama ayarlarına bağlı olarak dağıtıldıkları ClickOnce sunucusundan denetlendiği için "temiz" yükleme dizinleri yoktur. (Güncellemeleri, sürüm gereksinimlerini vb. Kontrol etme).


Sunucudaki C: \ Documents & Settings klasörüne erişimim yok, yani uygulamanın oluşturduğu dosyaya erişimim yok. Uygulamayı belirli bir klasörden çalıştırıyorum. Uygulamanın yayınlandığı klasördür. Bu klasörün yolunu nasıl alabilirim?
Tony_Henrich

Oh, dağıtım URL'sini istiyorsunuz. Üzgünüm, hiç anlamadım. ClickOnce uygulamasının içinden mi yoksa harici bir uygulamadan mı almaya çalışıyorsunuz?
Mart'ta

1

İşte benim clickonce uygulamamın konuşlandırılmış klasör konumunu elde etmek için çalıştı ve benzer, özel senaryom için aramalarımda gördüğüm herhangi bir yerde belirtilmeyen şeyleri buldum:

  • Clickonce uygulaması bir şirket LAN ağı klasörüne dağıtılır.
  • Clickonce uygulaması çevrimiçi veya çevrimdışı kullanılabilir olacak şekilde ayarlanmıştır.
  • Proje mülklerimdeki clickonce kurulum URL'm ve Güncelleme URL'lerimde hiçbir şey belirtilmedi. Yani, kurulum veya güncellemeler için ayrı bir konum yoktur.
  • Yayınlama seçeneklerimde, clickonce uygulaması için bir masaüstü kısayolu oluşturuyorum.
  • Başlangıçta yol almak istediğim klasör, uygulamanın kodunu yazmadan uygulamanın DEV, INT ve PROD sürümleri tarafından erişilmesini istediğim klasör.

İşte benim kullanım durumumun bir görsel:

resim açıklamasını buraya girin

  • Mavi kutulu klasörler, her ortamın uygulaması için dizin yerlerimdir.
  • Kırmızı kutulu klasör, yolunu almak istediğim dizindir (uygulamanın ilk olarak OP ile aynı olan konuşlandırılmış klasör konumu "MyClickOnceGreatApp_1_0_0_37" almayı gerektirir).

Clickonce uygulamasının dağıtıldığı klasörü döndürmek için bu sorudaki önerilerini veya yorumlarını bulamadım (daha sonra ilgilendiğim klasörü bulmak için bu klasöre göre hareket edeceğim). Başka hiçbir internet araması ya da ilgili SO sorusu da cevap vermedi.

Önerilen özelliklerin tümü, nesnenin (örn. ActivationUri) boş olması nedeniyle başarısız olmuş veya yerel bilgisayarın önbelleğe alınmış yüklü uygulama klasörünü işaret ediyordu. Evet, null nesnelerini zarif bir şekilde IsNetworkDeployed için bir çekle işleyebilirim - bu bir sorun değil - ama şaşırtıcı bir şekilde IsNetworkDeployed, aslında clickonce uygulaması için ağa dağıtılmış bir klasör konumuna sahip olmamasına rağmen yanlış döndürür. Bunun nedeni, uygulamanın yerel, önbelleğe alınmış bitlerden çalıştırılmasıdır.

Çözüm şunlara bakmaktır:

  • AppDomain.CurrentDomain.BaseDirectory uygulama görsel stüdyo içerisinde geliştirilirken,
  • System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation normal yürütülürken.

System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocationclickonce uygulamamın dağıtıldığı ağ dizinini her durumda doğru şekilde döndürür. Yani, üzerinden başlatıldığında:

  • setup.exe
  • MyClickOnceGreatApp.application
  • Uygulamanın ilk yüklenmesi ve başlatılmasıyla oluşturulan masaüstü kısayolu.

İşte WorkAccounts klasörünün yolunu almak için uygulama başlangıcında kullandığım kod. Konuşlanan uygulama klasörünü almak, yalnızca üst dizinlere gitmeyerek basittir:

string directoryOfInterest = "";
if (System.Diagnostics.Debugger.IsAttached)
{
    directoryOfInterest = Directory.GetParent(Directory.GetParent(Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).FullName).FullName).FullName;
}
else
{
    try
    {
        string path = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString();
        path = path.Replace("file:", "");
        path = path.Replace("/", "\\");
        directoryOfInterest = Directory.GetParent(Directory.GetParent(path).FullName).FullName;
    }
    catch (Exception ex)
    {
        directoryOfInterest = "Error getting update directory needed for relative base for finding WorkAccounts directory.\n" + ex.Message + "\n\nUpdate location directory is: " + System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString();
    }
}

0

Sorunun, kullanıcının bilgisayarında ClickOnce (true == System.Deployment.ApplicationDeploy.IsNetworkDeployed) uygulaması yüklendikten sonra uygulama klasöründeki dosyalara erişmeyle ilgili olduğunu varsayarsak, bu klasörü uygulamanın kendisi tarafından almanın üç yolu vardır:

String path1 = System.AppDomain.CurrentDomain.BaseDirectory;
String path2 = System.IO.Directory.GetCurrentDirectory();    
String path3 = System.Reflection.Assembly.GetExecutingAssembly().CodeBase; //Remove the last path component, the executing assembly itself.

Bunlar VS IDE'den ve dağıtılmış / yüklenmiş bir ClickedOnce uygulamasından çalışır, "true == System.Deployment.ApplicationDeploy.IsNetworkDeployed" kontrolü gerekmez. ClickOnce, Visual Studio 2017 projesinde bulunan tüm dosyaları seçer, böylece uygulama, uygulama içindeki göreli yolları kullanarak dağıtılan dosyalara erişebilir.

Bu, Windows 10 ve Visual Studio 2017'ye dayanmaktadı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.