J'ai besoin d'écrire un fichier dans le même dossier où réside une console ClickOnce .application
(fichier exécutable). Le dossier à partir duquel il est lancé.
J'ai essayé d'utiliser Application.StartupPath
& Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
mais le chemin pointe vers un sous-dossier sous c:\Documents & Settings
. Comment puis-je obtenir le chemin où .application
réside le?
C'est vrai.
ClickOnce applications
sont installés sous le profil de l'utilisateur qui les a installés. Avez-vous emprunté le chemin que vous a donné la récupération des informations de l'assembly en cours d'exécution et êtes-vous allé le vérifier?Sur Windows Vista et Windows 7, vous trouverez le cache ClickOnce ici:
Sous Windows XP, vous le trouverez ici:
la source
ApplicationDeployment.CurrentDeployment.ActivationUri peut fonctionner
"Une chaîne de longueur nulle si la propriété TrustUrlParameters dans le manifeste de déploiement est false, ou si l'utilisateur a fourni un UNC pour ouvrir le déploiement ou l'a ouvert localement. Sinon, la valeur renvoyée est l'URL complète utilisée pour lancer l'application, y compris tous les paramètres. "
MAIS ce que je pense que vous voulez vraiment, c'est ApplicationDeployment.CurrentDeployment.DataDirectory qui vous donne un dossier dans lequel vous pouvez écrire des données. Lorsque vous mettez à jour l'application de toute façon, vous perdez ce qui se trouvait dans le dossier .exe d'origine, mais vous pouvez migrer le répertoire de données vers une nouvelle version de l'application. Votre application peut écrire dans ce dossier avec tous les fichiers journaux dont elle dispose - et je suis à peu près sûr que son écriture est garantie.
la source
J'utilise
Assembly.GetExecutingAssembly().Location
pour obtenir le chemin vers uneClickOnce
application déployée dans .Net 4.5.1.Cependant, vous ne devez écrire dans aucun dossier dans lequel votre application est déployée, quelle que soit la méthode de déploiement (xcopy, ClickOnce, InstallShield, quoi que ce soit), car ceux-ci sont généralement en lecture seule pour les applications, en particulier dans les nouvelles versions de Windows et les environnements de serveur.
Une application doit toujours écrire dans les dossiers réservés à ces fins. Vous pouvez obtenir les dossiers dont vous avez besoin à partir de Environment.SpecialFolder Enumeration. La page MSDN explique à quoi sert chaque dossier: http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx
C'est-à-dire pour les données, les journaux et autres fichiers que l'on peut utiliser
ApplicationData
(itinérance),LocalApplicationData
(local) ouCommonApplicationData
. Pour les fichiers temporaires, utilisezPath.GetTempPath
ouPath.GetTempFileName
.Les éléments ci-dessus fonctionnent également sur les serveurs et les ordinateurs de bureau.
EDIT:
Assembly.GetExecutingAssembly()
est appelé dans l'exécutable principal.la source
Applications ClickOnce DO résident dans un sous - répertoire C: \ Documents & Settings. Ils n'ont pas de répertoires d'installation «propres» car les fichiers locaux sont essentiellement téléchargés «temporairement» pour permettre à l'application de s'exécuter sur le PC local et l'exécution de l'application est contrôlée à partir du serveur ClickOnce sur lequel ils sont déployés en fonction des paramètres de publication. (Vérification des mises à jour, des exigences de version, etc.).
la source
Voici ce que j'ai trouvé qui a fonctionné pour pouvoir obtenir l'emplacement du dossier déployé de mon application clickonce et qui n'a été mentionné nulle part dans mes recherches, pour mon scénario similaire et spécifique:
Voici un visuel de mon cas d'utilisation:
Je n'ai trouvé aucune des suggestions de cette question ou de leurs commentaires pour retourner le dossier dans lequel l'application clickonce a été déployée (que je déplacerais ensuite par rapport à ce dossier pour trouver le dossier d'intérêt). Aucune autre recherche sur Internet ni aucune question relative à l'OS n'a donné de réponse.
Toutes les propriétés suggérées échouaient en raison de la nullité de l'objet (par exemple ActivationUri) ou pointaient vers le dossier d'application installée en cache du PC local. Oui, je pourrais gérer gracieusement les objets nuls en vérifiant IsNetworkDeployed - ce n'est pas un problème - mais, étonnamment, IsNetworkDeployed renvoie false même si j'ai en fait un emplacement de dossier déployé sur le réseau pour l'application clickonce. En effet, l'application s'exécute à partir des bits locaux mis en cache.
La solution est de regarder:
AppDomain.CurrentDomain.BaseDirectory
lorsque l'application est exécutée dans Visual Studio pendant que je développe etSystem.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
lorsqu'il s'exécute normalement.System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
renvoie correctement le répertoire réseau dans lequel mon application clickonce est déployée, dans tous les cas. Autrement dit, lorsqu'il est lancé via:Voici le code que j'utilise au démarrage de l'application pour obtenir le chemin du dossier WorkAccounts. Obtenir le dossier d'application déployé est simple en ne se dirigeant pas vers les répertoires parents:
la source
En supposant que la question porte sur l'accès aux fichiers dans le dossier de l'application après que l'application ClickOnce (true == System.Deployment.ApplicationDeploy.IsNetworkDeployed) est installée sur le PC de l'utilisateur, il existe trois façons d'obtenir ce dossier par l'application elle-même:
Ceux-ci fonctionnent à partir de VS IDE et d'une application ClickedOnce déployée / installée, aucune vérification "true == System.Deployment.ApplicationDeploy.IsNetworkDeployed" n'est requise. ClickOnce récupère tous les fichiers inclus dans le projet Visual Studio 2017 afin que l'application puisse vraiment accéder à tous les fichiers déployés à l'aide de chemins relatifs à partir de l'application.
Ceci est basé sur Windows 10 et Visual Studio 2017
la source