Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема при самоудалении exe-файла 
V
    Опции темы
FEV
Дата 14.8.2009, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 14.8.2009

Репутация: нет
Всего: нет



Здравствуйте. Помогите разобраться со следующей проблемой:
в программе есть метод, который должен удалять exe-файл этой же самой программы

Код

internal static void DeleteExeNow()
        {
            
            int p = Application.ExecutablePath.LastIndexOf('\\');
            string exe = Application.ExecutablePath.Substring(p + 1);
            string bat = Application.StartupPath + @"\uninst.bat";
           
            FileStream fs = new FileStream(bat, FileMode.Create);
            StreamWriter sw = new StreamWriter(fs);
            sw.WriteLine(":looop");
            sw.WriteLine(string.Format("del \"{0}\"", exe));
            sw.WriteLine(string.Format("if exist \"{0}\" goto :looop", exe));
            sw.WriteLine("del /q uninst.bat");
            sw.Close();
            fs.Close();
         
            Process ps = new Process();
            ps.StartInfo.FileName = bat;
            ps.StartInfo.UseShellExecute = false; // true тоже не помогает
            ps.Start();
           
            Environment.Exit(0);
        }


при выполнении данного метода батник создаётся, заполняется необходимым скриптом, но вот 
ps.Start() этот батник по какой-то причине не запускает.  На долю секунды появляется консольное окно и сразу исчезает. Программа завершается по Environment.Exit(0), но и экзешник и батник остаются нетронутыми. Если бат-файл запускать вручную, предварительно запустив exe-файл, то всё работает прекрасно, т.е. в бат-файле выполняется холостой цикл, и после завершения работы exe-файла оба файла удаляются.

Путем перенаправления потока вывода удалось определить что в появляющемся на долю секунды консольном окне содержится единственная строчка следующего вида:
текущая_директория>del имя_exe_файла
PM MAIL   Вверх
vlsaf
Дата 14.8.2009, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 9.5.2007

Репутация: нет
Всего: 1



Ты должен запустить ps.Start();
Завершить текущую программу, иначе она не отпустит файл
дождаться в батнике, когда завершиться процесс основной программы
Удалить файл.
PM   Вверх
FEV
Дата 14.8.2009, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 14.8.2009

Репутация: нет
Всего: нет



ты бы хоть на код метода вглянул - там именно это и делаеться....
PM MAIL   Вверх
FEV
Дата 15.8.2009, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 14.8.2009

Репутация: нет
Всего: нет



может быть кому-нибудь пригодится. Привожу тут работоспособный метод, мгновенно самоудаляющий exe-файл:

Код

        internal static void DeleteExeNow()
        {
            string p = Application.ExecutablePath;
            int q = p.LastIndexOf(@"\");
            string exe = p.Substring(q + 1, p.Length - q - 1);

            StreamWriter sw = new StreamWriter("uninst.bat", false, Encoding.GetEncoding(1251));
            sw.WriteLine(":metka");
            sw.WriteLine(string.Format("del \"{0}\"", exe));
            sw.WriteLine(string.Format("if exist \"{0}\" goto :metka", exe));
            sw.WriteLine("del uninst.bat");
            sw.Close();

            Process ps = new Process();
            ps.StartInfo.FileName = "uninst.bat";
            ps.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            ps.Start();

            Environment.Exit(0);
        }



проблема была в 2х строчках
string bat = Application.StartupPath + @"\uninst.bat";
ps.StartInfo.FileName = bat;
в Application.StartupPath содержались пробелы и из-за этого ps.Start() работал некорректно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0421 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.