С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
watersoda
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 97
1

Почему C++ программа не удаляет саму себя?

21.11.2015, 18:22. Просмотров 874. Ответов 21
Метки нет (Все метки)

Имеется следующий код (файл 01del.cpp):

C++
1
2
3
4
5
6
7
#include <windows.h>
using namespace std;
int main()
{
system("del /q "D:\\01del.exe"");
return 0;
}
При запуске бинарника 01del.exe в консоли выдаётся сообщение:
Отказано в доступе.
Однако, если создать файл 01del.bat, содержащий
Windows Batch file
1
2
@echo off
del /q "D:\01del.bat"
то при его запуске он сам себя успешно удалит.

Почему же C++ программа не удаляет саму себя?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2015, 18:22
Ответы с готовыми решениями:

Перемножить матрицу на саму себя
Подскажите пожалуйста, как можно реализовать эту задачу: Нужно будет...

Непонятно почему ведёт себя так программа
Задачка: //На шахматной доске 8х8 расположены три фигуры: ферзь, ладья и...

Функция должна принять указатель на саму себя
не рекурсия. (ошибка в названии) Функция должна принять указатель на саму...

Почему программа себя странно ведет: зацикливается после ввода значений?
Зацикливается после воода значений. Подскажите пожалуйста в чем может быть...

Нюансы работы с массивами: почему программа ведёт себя не так, как ожидается?
// ConsoleApplication20.cpp: определяет точку входа для консольного приложения....

21
Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92
21.11.2015, 18:27 2
Лучший ответ Сообщение было отмечено watersoda как решение

Решение

Потому, что при запуске .bat файла он весь выгружается в консоль, и не контактирует с файлом который вы запустили с пк, следовательно файл на пк удалить можно.
Однако если вы запускаете .exe файл, и пробуете его удалить пока он включен, пк откажет вам в доступе, т.к. процесс и файл связаны.
Приведу аналогию на человеке который хочет съесть сам себя (О_о упароло).
Если человека клонировать (аналогично запуск .bat) то человек может съесть себя изначального, а клон умрет после завершения программы
А если человека не клонировать, то он съесть себя не сможет(Вот это поворот)
6
watersoda
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 97
21.11.2015, 18:29  [ТС] 3
почему-то С++ код сохраняется некорректно - в строке system("del /q "D:\\01del.exe"");

перед вторыми двойными кавычками и после .exe должен быть знак \.
0
Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92
21.11.2015, 18:30 4
это служебный знак, поставьте вместо него \U005C (это код этого слеша на UTF8)
0
_Ivana
21.11.2015, 18:31
  #5

Не по теме:

Fenix78563, аналогия доставляет :)

0
Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92
21.11.2015, 18:35 6
Попробуйте в код перед удалением добавить строку:
C++
1
Application::Exit();
хотя по идее после этого шага программа уже ничего не делает

Добавлено через 1 минуту
_Ivana,
0
watersoda
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 97
21.11.2015, 18:47  [ТС] 7
Добавил, при компиляции получил сообщение:
error: 'Application' has not been declared|
0
Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92
21.11.2015, 18:50 8
Это потому, что я затупил. Это метод из windows forms
0
Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92
21.11.2015, 18:54 9
создайте батник в котором будет лежать инструкция по удалению программы, и вклейте его перед закрытием программы, если добавить в батник отсрочку то должно получиться
0
watersoda
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 97
21.11.2015, 18:57  [ТС] 10
А как в батник добавить отсрочку?
0
Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92
21.11.2015, 19:02 11
очень дебильный вариант но железный
C++
1
ping -n 1 -w 100000 192.168.254.254 >nul
пинг не существующего ip длится 100 сек

Добавлено через 49 секунд
C++
1
2
3
4
5
TStringList *List = new TStringList();  //создает сущность для текста
List->Strings[0]="что будет в первой строке";
List->Strings[1]="что будет во второй строке";  //скорее всего это не нужно. Но обычно можно команду Pause вписать
List->SaveToFile("C:\\1.bat");
delete List;
кстати так можно создать батник прямо в коде программы

Добавлено через 1 минуту
Bash
1
TIMEOUT [/T] 50 [/NOBREAK]
это еще вариант отсрочки
уже управляемый
1
watersoda
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 97
21.11.2015, 21:10  [ТС] 12
Цитата Сообщение от Fenix78563 Посмотреть сообщение
TStringList *List = new TStringList(); *//создает сущность для текста
List->Strings[0]="что будет в первой строке";
List->Strings[1]="что будет во второй строке"; *//скорее всего это не нужно. Но обычно можно команду Pause вписать
List->SaveToFile("C:\\1.bat");
delete List;
error: 'TStringList' was not declared in this scope|
error: 'List' was not declared in this scope|
error: expected type-specifier before 'TStringList'|
error: expected ';' before 'TStringList'|
error: type '<type error>' argument given to 'delete', expected pointer|
0
ilja123
43 / 43 / 6
Регистрация: 24.12.2009
Сообщений: 439
21.11.2015, 21:15 13
Цитата Сообщение от Fenix78563 Посмотреть сообщение
удалить пока он включен, пк откажет вам в доступе
Наверно не ПК, а Windows откажет.

Что, если попробовать сначала выгрузить прогу из "запущенных процессов"? По идее, Windows после этого возражать не станет
0
nmcf
6517 / 5746 / 2617
Регистрация: 14.04.2014
Сообщений: 24,494
21.11.2015, 21:19 14
Это для Builder пример.
0
Mesteriis
379 / 162 / 51
Регистрация: 08.08.2015
Сообщений: 1,150
Завершенные тесты: 1
21.11.2015, 22:08 15
watersoda, Если вопрос про винду, то в процесс работы собери cmd/bat файл передай ему путь к exe. Потом отдельным потоком запусти его, и после завершения работы программы он сотрет весь мусор и себя!
0
Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92
22.11.2015, 12:13 16
watersoda, А вы на чем пишете?
0
Mesteriis
379 / 162 / 51
Регистрация: 08.08.2015
Сообщений: 1,150
Завершенные тесты: 1
22.11.2015, 20:28 17
Fenix78563, ))))) по коду не видно???
0
watersoda
0 / 0 / 0
Регистрация: 04.04.2015
Сообщений: 97
23.11.2015, 19:23  [ТС] 18
Цитата Сообщение от Fenix78563 Посмотреть сообщение
watersoda, А вы на чем пишете?
CodeBlocks + MinGW.

Добавлено через 21 час 30 минут
Обнаружил следующее:


В Windows XP timeout не является внутренней или внешней командой, исполняемой программой или пакетным файлом.

Привёл программу к следующему виду:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <windows.h>
#include <string>
#include <vector>
#include <fstream>
#include <iomanip>
using namespace std;
int main()
{
vector<string> tb;
tb.push_back("@echo off");
tb.push_back("del /q 01del.exe");
for(vector<string>::iterator kt = tb.begin(); kt != tb.end(); ++kt)
{
ofstream out("test.bat", ios::out | ios::app);
out << *kt << endl;
out.close();
}
system("test.bat");
return 0;
}
Снова получил отказ в доступе.

Возникла такая мысль: C++ программа в данном случае завершится только после выполнения system("test.bat");
поэтому при попытке выполнить del /q 01del.exe опять повторится ситуация с невозможностью удалить файл, пока не завершён связанный с ним процесс.
0
Байт
Эксперт C
19259 / 12378 / 2615
Регистрация: 24.12.2010
Сообщений: 25,493
23.11.2015, 19:49 19
Как ни странно, бинарник во время своей работы может сам себя переименовать. Однако удалить переименованный файл во время работы - нельзя.
1
daslex
23.11.2015, 23:38     Почему C++ программа не удаляет саму себя?
  #20

Не по теме:

Цитата Сообщение от Байт Посмотреть сообщение
Как ни странно
чего тут странного. Он сам свое имя знать не обязан, оно ему (это имя) не надо. Оно нужно ОС, а не себе любимому. Оно же не внутри бинарника хранится, а вне бинарника для связи с ним. Изменения этого имени внутренности бинарника не затрагивают и сам бинарник в целом не затрагивают вообще. А удаление бинарника - покушение на его внутренние органы (печень там, почки, сердце..)
очень обычная логика.

0
23.11.2015, 23:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2015, 23:38
Привет! Вот еще темы с ответами:

Нюансы работы с оператором ветвления if else: почему программа ведёт себя не так, как ожидается?
Имеется код: int a; char q; for (;;) { cout &lt;&lt; &quot;Введите число: &quot;; ...

Нюансы работы с оператором ветвления if else: почему программа ведёт себя не так, как ожидается?
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; void...

Почему функция не удаляет минимальный элемент
Вот кусок функции void second::Udal_Min() { for(int i=0;i&lt;n;i++)\ {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru