Preciso escrever um arquivo na mesma pasta em que um ClickOnce do console .application
(arquivo executável) reside. A pasta de onde é iniciada.
Eu tentei usar Application.StartupPath
& Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
mas o caminho está apontando para uma subpasta em c:\Documents & Settings
. Como obtenho o caminho em que .application
reside?
Está certo.
ClickOnce applications
são instalados sob o perfil do usuário que os instalou. Você pegou o caminho que a recuperação das informações do assembly em execução lhe deu e foi dar uma olhada?No Windows Vista e Windows 7, você encontrará o cache do ClickOnce aqui:
No Windows XP, você o encontrará aqui:
fonte
ApplicationDeployment.CurrentDeployment.ActivationUri pode funcionar
"Uma cadeia de caracteres de tamanho zero se a propriedade TrustUrlParameters no manifesto de implantação for falsa ou se o usuário tiver fornecido um UNC para abrir a implantação ou a tiver aberto localmente. Caso contrário, o valor de retorno será o URL completo usado para iniciar o aplicativo, incluindo quaisquer parâmetros ".
Mas o que eu acho que você realmente deseja é ApplicationDeployment.CurrentDeployment.DataDirectory, que fornece uma pasta na qual você pode gravar dados. Quando você atualiza o aplicativo de qualquer maneira, perde o que estava na pasta .exe original, mas pode migrar o diretório de dados para uma nova versão do aplicativo. Seu aplicativo pode gravar nesta pasta com os arquivos de log que ele possui - e eu tenho certeza que é garantido que seja gravável.
fonte
Estou usando
Assembly.GetExecutingAssembly().Location
para obter o caminho para umClickOnce
aplicativo implantado no .Net 4.5.1.No entanto, você não deve gravar em nenhuma pasta em que seu aplicativo seja implantado para sempre, independentemente do método de implantação (xcopy, ClickOnce, InstallShield, qualquer coisa), porque esses geralmente são apenas de leitura para aplicativos, especialmente em versões mais recentes do Windows e em ambientes de servidor.
Um aplicativo sempre deve gravar nas pastas reservadas para esses fins. Você pode obter as pastas necessárias a partir da Enumeração Environment.SpecialFolder. A página MSDN explica para que serve cada pasta: http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx
Ou seja, para dados, logs e outros arquivos que se pode usar
ApplicationData
(roaming),LocalApplicationData
(local) ouCommonApplicationData
. Para arquivos temporários, usePath.GetTempPath
ouPath.GetTempFileName
.O trabalho acima também funciona em servidores e desktops.
EDIT:
Assembly.GetExecutingAssembly()
é chamado no executável principal.fonte
ClickOnce aplicativos FAZER reside em um subdiretório de C: \ Documentos e Configurações. Eles não têm diretórios de instalação "limpos" porque os arquivos locais são baixados "temporariamente" para permitir que o aplicativo seja executado no PC local e a execução do aplicativo é controlada no servidor ClickOnce em que eles são implantados, dependendo das configurações de publicação (Verificando atualizações, requisitos de versão etc.).
fonte
Aqui está o que eu achei que funcionava para conseguir o local da pasta implantada do meu aplicativo clickonce e que não havia sido mencionado em nenhum lugar que eu vi nas minhas pesquisas, no meu cenário específico semelhante:
Aqui está um visual do meu caso de uso:
Não encontrei nenhuma das sugestões nesta pergunta ou seus comentários para retornar a pasta na qual o aplicativo clickonce foi implantado (que eu passaria em relação a essa pasta para encontrar a pasta de seu interesse). Nenhuma outra pesquisa na Internet ou perguntas relacionadas ao SO apresentaram uma resposta também.
Todas as propriedades sugeridas estavam com falha devido ao objeto (por exemplo, ActivationUri) ser nulo ou estavam apontando para a pasta do aplicativo instalado em cache do PC local. Sim, eu poderia lidar com objetos nulos com facilidade, verificando IsNetworkDeployed - isso não é um problema -, mas surpreendentemente IsNetworkDeployed retorna false, mesmo que eu tenha, de fato, um local de pasta implantado em rede para o aplicativo clickonce. Isso ocorre porque o aplicativo está sendo executado nos bits em cache locais.
A solução é olhar para:
AppDomain.CurrentDomain.BaseDirectory
quando o aplicativo está sendo executado no visual studio à medida que desenvolvo eSystem.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
quando está executando normalmente.System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
retorna corretamente o diretório de rede em que meu aplicativo clickonce está implantado, em todos os casos. Ou seja, quando é lançado via:Aqui está o código que eu uso na inicialização do aplicativo para obter o caminho da pasta WorkAccounts. Obter a pasta do aplicativo implantado é simples, apenas não marcando para os diretórios pai:
fonte
Supondo que a pergunta seja sobre o acesso a arquivos na pasta do aplicativo após a instalação do aplicativo ClickOnce (true == System.Deployment.ApplicationDeploy.IsNetworkDeployed) no PC do usuário, há três maneiras de obter essa pasta pelo próprio aplicativo:
Eles funcionam no VS IDE e em um aplicativo ClickedOnce implantado / instalado, nenhuma verificação "true == System.Deployment.ApplicationDeploy.IsNetworkDeployed" necessária. O ClickOnce seleciona todos os arquivos incluídos no projeto Visual Studio 2017 para que o aplicativo possa acessar todo e qualquer arquivo implantado usando caminhos relativos de dentro do aplicativo.
Isso é baseado no Windows 10 e Visual Studio 2017
fonte