Dariush Gavari Ответов: 2

Как открыть запустить файл после того как пользователь сохранит файл с помощью savefiledialog


привет,

у меня есть программа, программа проверяет версию программы, если обновление доступно, появляется savefilediag, и пользователь может сохранить его в любом месте.

мне нужно запустить загруженный файл с пользовательским путем, выбранным перед автоматическим запуском.

Что я уже пробовал:

в этой строке
saveFileDialog1.OpenFile();


я получаю ошибку

Процесс не может получить доступ к файлу, потому что он используется другим процессом.'


public void checkForUpdate()
       {
           //Update From Website.
           string URL = "http://pingmanager.ir/program/";
           string AppName = saveFileDialog1.FileName = "PingManager.msi";
           string ServerVersion;
           string serverVersionName = "version.txt";
           string Flname = "PingManager.msi";


           // Request
           WebRequest req = WebRequest.Create(URL + serverVersionName);
           WebResponse res = req.GetResponse();
           Stream str = res.GetResponseStream();
           StreamReader tr = new StreamReader(str);
           ServerVersion = tr.ReadLine();

           if(getVersion() != ServerVersion)
           {
               //Update.
               WebClient client = new WebClient();
               byte[] appdata = client.DownloadData(URL + AppName);

               // Message for Update Available.
               MessageBox.Show("Update is Available.", "PingManager",
               MessageBoxButtons.OK, MessageBoxIcon.Warning);

               // Save the New Version of Program From Website.
               if (saveFileDialog1.ShowDialog() == DialogResult.OK)
               {
                   // Save Name of Setup File.
                   using (FileStream fs = File.Create(saveFileDialog1.FileName))
                   {
                       fs.Write(appdata, 0, appdata.Length);
                       saveFileDialog1.OpenFile();
                   }

                   // Message of The New Version of Setup Downloaded.
                   MessageBox.Show("Update File Compeleted.", "PingManager",
                   MessageBoxButtons.OK, MessageBoxIcon.Information);

               }


               this.Close();

2 Ответов

Рейтинг:
17

Dave Kreskowiak

Вы можете просто удалить "saveFileDialog1.OpenFile();" строка полностью.

Он вообще не нужен, потому что вы не понимаете, что он делает. Все, что делает метод OpenFile (), - это открывает файл для чтения/записи и возвращает объект Stream. Поскольку вы не присваиваете этот объект Stream переменной, вы просто выбрасываете то, что возвращает метод OpenFile ().

ОН НЕ ЗАПУСКАЕТ ФАЙЛ!

Кроме того, файл, который вы пишете, не закрывается до тех пор, пока using блок, с помощью которого вы открыли файл. Вы пытаетесь открыть файл с помощью OpenFile, в то время как файл все еще открыт FileStream, созданным в using блок.

Чтобы запустить установщик, вам придется использовать класс Process. Вы, вероятно, могли бы выйти сухими из воды. Начать[^] метод.


Рейтинг:
0

OriginalGriff

Вы не можете обновить файл, потому что он используется - он работает!
Чтобы обновить приложение, вам нужно запустить другой EXE-файл.

Пусть ваше приложение запуска будет небольшим средством обновления, которое проверяет, есть ли обновление, которое нужно сделать.
Если его нет, то он запускает "настоящий" EXE-файл через процесс.Запуск и закрытие.
Если есть обновление, программа обновления загружает изменения, обновляет соответствующие файлы, а затем запускает новый "реальный" EXE-файл, а затем закрывается.