Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: www.madnesstudio.ru
 Профиль | | #3
Добавлено: 29.09.07 23:40
Всем спасибо!
Нашел как "обойти" ошибку и сделать обновление из текущего файла.
Вопрос закрыт :)

Стоп-стоп-стоп!
Это как? Как так сделать?

Ответить

Номер ответа: 4
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #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" (в моем случае - ".###";), и доступ закрывается именно к нему.
А на его место выкладывается новая версия, которая затем и запускается.

Код переделывал из своего, выкидывая из него то, что относится к проекту и не имеет отношения к рассматриваемому вопросу, но надеюсь что ничего лишнего не полямзал.
если чего то не досмотрел - спрашивайте, передопишу ошибки :)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам