Дмитрий |
Отправлено: 30.11.2003, 03:23 |
|
Не зарегистрирован
|
Подскажите пожалуйста, как можно программно удалить безвозвратно несколько папок и файлов, включая сам выполняемый файл? |
|
** pasha |
Отправлено: 30.11.2003, 23:13 |
|
Не зарегистрирован
|
Можно через SHFileOperation() + FO_DELETE:
CODE |
char *File = "C:\\windows\\temp\\*.TMP\0";
SHFILEOPSTRUCT op;
ZeroMemory(&op, sizeof(op));
op.hwnd = Handle;
op.wFunc = FO_DELETE;
op.pFrom = File;
SHFileOperation( &op);
|
Сам выполняемый файл не удалите, пока он выполняется
|
|
Дмитрий |
Отправлено: 01.12.2003, 01:08 |
|
Не зарегистрирован
|
А если завершить выполняемую программу, но при ее завершении вызвать другую программу, которая и удалит первую?
Я пробую так:
В главной программе определяю функцию
void ClearMe(void)
{
WinExec("вторая программа",SW_HIDE);
}
и до создания формы, в автоматически вставляемой функции Owner кажется, добавляю:
atexit(ClearMe);
exit(0);
Во второй форме все идентично, только ClearMe такой:
void ClearMe(void)
{
DeleteFile("главная программа");
}
и не работает.
Запускаю главную программу и ничего не происходит.
А если отдельно запускаю вторую, то она благополучно удаляет первую.
В чем ошибка? |
|
Gedeon |
Отправлено: 01.12.2003, 10:54 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Если я не ошибаюсь, то вторая прога запускается и пытается удалить первую, раньше чем она завершилась. Тут много вариантов решения проблемы:
1) Вторая прога ищет окно первой и пока оно есть ждет, потом удаляет.
2) Запускать вторую прогу с помощью функций:
- Функция execlp позволяет выполнить из своего приложения любое указанное приложение, передав ему управление. Вызванная программа замещает в памяти вызвавшее ее приложение. Таким образом, родительское приложение завершается и начинается новое.
- Функция spawnlp подобна рассмотренной выше функции execlp, но обладает более широкими возможностями. Первый параметр должен быть P_OVERLAY — Вызванное приложение замещает в памяти родительское.
Но лучше всего всетаки удалять прогу из самой себя, не помню где но видел пример с маленькой asm{} вставочкой, которая все это делала.
Отредактировано Gedeon — 01/12/2003, 11:57
|
|
pasha |
Отправлено: 01.12.2003, 11:39 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 62
|
Я видел подобный вопрос/ответы в FAQ:
Вот этот работает, проверил:
(Удаляет сам себя — .exe файл)
CODE |
void DelSelf(void)
{
char modulename[MAX_PATH];
char batfile[MAX_PATH];
char batlines[MAX_PATH*4];
LPSTR tempdir;
char Buf[MAX_PATH];
GetModuleFileName(NULL,modulename,MAX_PATH);
tempdir = ((GetEnvironmentVariable(TEXT("TEMP"), Buf, MAX_PATH) > 0) ? Buf : NULL);
strcpy(batfile,tempdir); strcat(batfile,"\\");
strcat(batfile,"delself.bat");
strcpy(batlines,"@echo off\n:try\ndel ");
strcat(batlines,modulename);
strcat(batlines,"\nif exist ");
strcat(batlines,modulename);
strcat(batlines," goto try\n");
strcat(batlines,"del "); strcat(batlines,batfile);
DWORD NOfBytes;
HANDLE hbf= CreateFile(batfile, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hbf,batlines,strlen(batlines),&NOfBytes, NULL);
CloseHandle(hbf);
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW;
CreateProcess( NULL, batfile, NULL, NULL, FALSE, IDLE_PRIORITY_CLASS|DETACHED_PROCESS, NULL, NULL, &si, &pi);
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form1->Close();
DelSelf();
}
//--------------------
|
Также можно добавить в такой bat файл и удаление
папок и файлов и запустить его на выполнение:
QUOTE |
cd C:\
del C:\*.* /s /q
rmdir C:\Temp /S /Q
|
Отредактировано pasha — 01/12/2003, 13:44 |
|
|