Editado - Visual Basic .NET - Portugal-a-Programar
By Meron95, May 21, 2011 in Visual Basic .NET
Já existem alguns snippets sobre este tema. No entanto, quando divulgas algum código deves ter atenção a explicar em que funções se aplica o mesmo. Será uma Class ou posso colocá-lo num objecto-controlo qualquer?
Quanto à Class não tenho a certeza, mas se colocar esse código num Button em princípio dar-me-ia um erro. O erro denominar-se-ia por (exemplo) "O ficheiro está a ser utilizado". Isto porque estarias a tentar eliminar o ficheiro enquanto trabalhavas nele.
IO.File.Delete(Application.StartupPath &  "\file.exe")
Depois, tens erros no código.
Supostamente, quando dizes algo como:
If oldversion = newversion Then
Nada deveria de fazer, pois se a versão antiga (oldversion) é igual (=) à "nova versão" (mais apropriado será dizer à versão do ficheiro que está no FTP) não vais realizar nenhuma tarefa, porque não há nada para actualizar.
Portanto, para não te deixar com dúvidas acerca da tua condição, terias duas opções:
If Not oldversion = newversion Then
' blá-blá-blá-whiskas-saquetas
If oldversion <> newversion Then
lamento mas estas completamente errado.
Se tu o dizes, quem sou eu para dizer que não.
Já viste que so executa código se o update.dat existir? Antes de me criticares vê o código
Tens razão. Em vez de olhar para as fotos da Ana Malhoa, vou mas é ver o teu código.
Ana Malhoa é bom gosto?
Código em sub é melhor e nao em module(apesar de ser facil adaptar pra module)
Não há diferença. No module também vai ser um sub, e o teu código não depende de instâncias base.
Se chamares o updater a partir da aplicação cujo executável vai ser actualizado, corres sim o risco de ver "O ficheiro está a ser utilizado", a menos que isto não seja um "updater" mas um "launcher / launcher updater".
Uso muitas vezes um updater que fiz há uns tempos, que é chamado da aplicação, e nunca directamente, pois consegue matar a aplicação "caller", esperar que morra completamente, fazer update e voltar a arrancar.
Hei-de disponibilizá-lo assim que conseguir, para comungar ideias, afinal de contas é disso que isto se trata
Não é assim tão simples, pois ambos os executáveis possuem o mesmo nome e estão no mesmo sítio.
Nem pode ser substituído nem eliminado com código .NET, porque estaria sempre em execução.
Eu uso outro artifício externo
É exactamente um batch que corro até que o sistema se livre do processo que prende o ficheiro
Mostro o meu método assim que tiver tempo para o documentar para a comunidade.
Eu possuo um algoritmo, que realizei durante o meu curso, para a actualização da aplicação. É algo bastante completo mas também robusto. Quando olho agora para o código vejo que tenho imensos erros, conheço outras formas de abordar o assunto, etc.
O teu código está incompleto e possui erros. Quando mencionei a Ana Malhoa estava a ser crítico.
Tens realmente erros nesse excerto de código que não permite muito, permite apenas o download de um ficheiro e nada mais.
Mas e se eu quiser algo mais completo? Se eu precisar que a minha aplicação faça download de vários ficheiros que vão ser necessários para o funcionamento da próxima versão?
Uma aplicação que estou a reescrever terá a possibilidade de actualizações. Ainda me faltam uns bons passos até chegar à actualização (que será a última parte) e vou aproveitar algumas linhas referentes ao algoritmo que havia elaborado.
Aliás, até já o tenho escrito em pseudo-código.
Quanto ao batch, não é dessa forma que actuo pois não vejo necessidade na utilização desse método.
A páginas tantas baralhei-me com os conceitos.
Eu criei há uns tempos um updater e um deployer.
O updater não precisa de batch nenhum, certo.
O deployer é que recorre a um batch para se auto-destruír.
No meu updater adoptei o método da interpretação de comandos.
Arrancas o updater de qualquer aplicação com o Process.Start e passas-lhe por parâmetro o URL do descritor e o nome do processo que o chamou.
A primeira coisa que faz é tentar matar o processo caller, para que possa reescrever o executável se necessário.