Necesito escribir un archivo en la misma carpeta donde reside una consola ClickOnce .application
(archivo ejecutable). La carpeta desde donde se inicia.
Intenté usar Application.StartupPath
& Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
pero la ruta apunta a una subcarpeta debajo c:\Documents & Settings
. ¿Cómo obtengo el camino donde .application
reside el?
Así es.
ClickOnce applications
se instalan bajo el perfil del usuario que los instaló. ¿Tomó el camino que le proporcionó la recuperación de la información del ensamblaje en ejecución y lo comprobó?En Windows Vista y Windows 7, encontrará la caché ClickOnce aquí:
En Windows XP, lo encontrará aquí:
fuente
ApplicationDeployment.CurrentDeployment.ActivationUri podría funcionar
"Una cadena de longitud cero si la propiedad TrustUrlParameters en el manifiesto de implementación es falsa, o si el usuario ha proporcionado un UNC para abrir la implementación o la ha abierto localmente. De lo contrario, el valor de retorno es la URL completa utilizada para iniciar la aplicación, incluyendo cualquier parámetro ".
PERO lo que creo que realmente quieres es ApplicationDeployment.CurrentDeployment.DataDirectory que te da una carpeta en la que puedes escribir datos. De todos modos, cuando actualice la aplicación, perderá lo que estaba en la carpeta .exe original, pero puede migrar el directorio de datos a una nueva versión de la aplicación. Su aplicación puede escribir en esta carpeta con cualquier archivo de registro que tenga, y estoy bastante seguro de que se garantiza que se puede escribir.
fuente
Estoy usando
Assembly.GetExecutingAssembly().Location
para obtener la ruta a unaClickOnce
aplicación implementada en .Net 4.5.1.Sin embargo, no debe escribir en ninguna carpeta en la que se haya implementado su aplicación, independientemente del método de implementación (xcopy, ClickOnce, InstallShield, cualquier cosa) porque generalmente se leen solo para aplicaciones, especialmente en las versiones más recientes de Windows y entornos de servidor.
Una aplicación siempre debe escribir en las carpetas reservadas para tales fines. Puede obtener las carpetas que necesita a partir de Environment.SpecialFolder Enumeration. La página de MSDN explica para qué sirve cada carpeta: http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx
Es decir, para datos, registros y otros archivos que uno puede usar
ApplicationData
(roaming),LocalApplicationData
(local) oCommonApplicationData
. Para archivos temporales usePath.GetTempPath
oPath.GetTempFileName
.Lo anterior también funciona en servidores y escritorios.
EDITAR:
Assembly.GetExecutingAssembly()
se llama en el ejecutable principal.fuente
Aplicaciones ClickOnce DO residen en un subdirectorio del directorio C: \ Documents y parámetros de configuración. No tienen directorios de instalación "limpios" porque los archivos locales se descargan esencialmente "temporalmente" para permitir que la aplicación se ejecute en la PC local y la ejecución de la aplicación se controla desde el servidor ClickOnce en el que se implementan según la configuración de publicación (Comprobación de actualizaciones, requisitos de versión, etc.).
fuente
Esto es lo que encontré que funcionó para poder obtener la ubicación de la carpeta desplegada de mi aplicación clickonce y que no se ha mencionado en ningún lugar que vi en mis búsquedas, para mi escenario similar y específico:
Aquí hay una imagen de mi caso de uso:
No encontré ninguna de las sugerencias en esta pregunta o sus comentarios para trabajar en la devolución de la carpeta en la que se implementó la aplicación clickonce (que luego movería en relación con esta carpeta para encontrar la carpeta de interés). Ninguna otra búsqueda en Internet o preguntas relacionadas con SO tampoco dieron una respuesta.
Todas las propiedades sugeridas fallaban debido a que el objeto (por ejemplo, ActivationUri) era nulo o apuntaban a la carpeta de la aplicación instalada en caché de la PC local. Sí, podría manejar con gracia los objetos nulos mediante una comprobación de IsNetworkDeployed, eso no es un problema, pero sorprendentemente IsNetworkDeployed devuelve falso aunque de hecho tengo una ubicación de carpeta desplegada en la red para la aplicación clickonce. Esto se debe a que la aplicación se ejecuta desde los bits locales en caché.
La solución es mirar:
AppDomain.CurrentDomain.BaseDirectory
cuando la aplicación se ejecuta en Visual Studio a medida que desarrollo ySystem.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
cuando se ejecuta normalmente.System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
devuelve correctamente el directorio de red en el que se implementa mi aplicación clickonce, en todos los casos. Es decir, cuando se inicia a través de:Aquí está el código que uso al iniciar la aplicación para obtener la ruta de la carpeta WorkAccounts. Obtener la carpeta de la aplicación implementada es simple simplemente no avanzando hacia los directorios principales:
fuente
Asumiendo que la pregunta es sobre el acceso a los archivos en la carpeta de la aplicación después de que la aplicación ClickOnce (true == System.Deployment.ApplicationDeploy.IsNetworkDeployed) está instalada en la PC del usuario, existen tres formas de obtener esta carpeta mediante la aplicación en sí:
Estos funcionan desde VS IDE y desde una aplicación ClickedOnce implementada / instalada, no se requiere verificación "true == System.Deployment.ApplicationDeploy.IsNetworkDeployed". ClickOnce recoge los archivos incluidos en el proyecto Visual Studio 2017 para que realmente la aplicación pueda acceder a todos los archivos implementados utilizando rutas relativas desde dentro de la aplicación.
Esto se basa en Windows 10 y Visual Studio 2017
fuente