Страница: 1 |
Страница: 1 |
Вопрос: Обновление программы.
Добавлено: 29.09.07 19:34
Автор вопроса: Marki
Приветствую всех!
Есть необходимость, чтобы при запуске программа проверяла возможность обновления до более новой версии и, при наличии такой возможности, самообновлялась.
С проверкой версии проблем нет, но при попытке скопировать файл на "самого себя" выдается сообщение об ошибке:
Вопрос: как решить проблемку?
Заранее всем спасибо.
Ответы
Всего ответов: 6
Номер ответа: 1
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #1
Добавлено: 29.09.07 20:39
систему обновления выносить в отдельный exe
Номер ответа: 2
Автор ответа:
Marki
Вопросов: 42
Ответов: 94
Профиль | | #2
Добавлено: 29.09.07 21:46
Всем спасибо!
Нашел как "обойти" ошибку и сделать обновление из текущего файла.
Вопрос закрыт
Номер ответа: 3
Автор ответа:
Wolf4D
Вопросов: 20
Ответов: 131
Web-сайт:
Профиль | | #3
Добавлено: 29.09.07 23:40
Нашел как "обойти" ошибку и сделать обновление из текущего файла.
Вопрос закрыт
Стоп-стоп-стоп!
Это как? Как так сделать?
Номер ответа: 4
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #4
Добавлено: 30.09.07 00:31
да. Минуточку-минуточку. Как это так?
Номер ответа: 5
Автор ответа:
Marki
Вопросов: 42
Ответов: 94
Профиль | | #5
Добавлено: 30.09.07 00:45
В данном случае разговор о ЛОКАЛЬНОМ обновлении, но у меня как раз именно такой вопрос.
Впрочем, для переделки в сетевой вариант изменений не сильно глобальные.
Коротко звучит так:
Public Class MyProgramm
CurrentFormLoad(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
'загрузка основной формы проекта
If updLocal(UpdateName) Then
'закрытие программы
Global.System.Windows.Forms.Application.Exit()
'запуск новой версии программы
Shell(Application.ExecutablePath, AppWinStyle.NormalFocus, False)
Exit Sub
End If
...
...
...
End Sub
End Class
Module Update
'Name - имя новой версии файла
'возвращает True если обновление прошло успешно
Public Function updLocal(ByVal Name As String) As Boolean
'проверка существования файла
If Not System.IO.File.Exists(Name) Then Return False
'данные по новому файлу
Dim FileVersion As FileVersionInfo = FileVersionInfo.GetVersionInfo(Name)
'проверка дискриптора файла
If Not System.IO.Path.GetFileNameWithoutExtension(Application.ExecutablePath) = FileVersion.FileDescription Then Return False
'проверка версии файла
If FileVersion.FileVersion = Application.ProductVersion Then Return False
'проверка каждой группы в версии файла
For intI As Short = 0 To FileVersion.FileVersion.Split(".".Length - 1
Select Case Val(FileVersion.FileVersion.Split("."(intI))
Case Is < Val(Application.ProductVersion.Split("."(intI))
Return False
Case Is > Val(Application.ProductVersion.Split("."(intI))
Exit For
End Select
Next
'имя нового файла в текущей папке
Dim NewName As String = System.IO.Path.GetDirectoryName(Application.ExecutablePath) & System.IO.Path.DirectorySeparatorChar & System.IO.Path.GetFileNameWithoutExtension(Name) & ".upd"
'имя резервной копии
Dim bakName As String = System.IO.Path.GetDirectoryName(Application.ExecutablePath) & System.IO.Path.DirectorySeparatorChar & System.IO.Path.GetFileNameWithoutExtension(Application.ExecutablePath) & ".###"
'копирование нового файла файла
Try
System.IO.File.Copy(Name, NewName, True)
If System.IO.File.Exists(bakName) Then System.IO.File.Delete(bakName)
'переименование нового файла в текущий файл
System.IO.File.Replace(NewName, Application.ExecutablePath, bakName, True)
Catch ex As Exception
'ошибка при копировании
Return False
End Try
'удаление резервной копии файла
Try
System.IO.File.Delete(bakName)
Catch ex As Exception
End Try
'возврат признака корректной обработки
Return True
End Function
End Module
Номер ответа: 6
Автор ответа:
Marki
Вопросов: 42
Ответов: 94
Профиль | | #6
Добавлено: 30.09.07 00:51
Суть, иначе говоря, в том, что файл, "используемый другим процессом", переименовывается в ".BAK" (в моем случае - ".###", и доступ закрывается именно к нему.
А на его место выкладывается новая версия, которая затем и запускается.
Код переделывал из своего, выкидывая из него то, что относится к проекту и не имеет отношения к рассматриваемому вопросу, но надеюсь что ничего лишнего не полямзал.
если чего то не досмотрел - спрашивайте, передопишу ошибки