Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2010, 02:17   #11
TrapQ
Пользователь
 
Аватар для TrapQ
 
Регистрация: 21.11.2010
Сообщений: 16
По умолчанию

Цитата:
Сообщение от psycho-coder Посмотреть сообщение
Этот пример проверил, удаляет даже с русскими символами в пути
Уж не знаю как ты проверял, но если исправить явную ошибку
Код:
WinExec(PChar(ChangeFileExt(CurDir,'.bat ')  + CurDir),SW_HIDE);
на
WinExec(PChar(ChangeFileExt(CurDir,'.bat')),SW_HIDE);
То bat файл действительно самоудалится а вот exe НЕТ.
Как два байта переслать...
TrapQ вне форума Ответить с цитированием
Старый 22.11.2010, 02:18   #12
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,863
По умолчанию

Вот рабочий код:

Код:
  CMDName := ChangeFileExt (ParamStr (0), '.cmd');
  AssignFile (F, CMDName);
  Rewrite (F);
  WriteLn (F, ':wait');
  WriteLn (F, 'del /q %~n0.exe');
  WriteLn (F, 'if exist %~n0.exe goto wait');
  WriteLn (F, 'del /q %~nx0');
  CloseFile (F);
  ShellExecute (0, 'open', PChar (CMDName), nil, nil, SW_HIDE);
  ExitProcess (0);

Последний раз редактировалось Arigato; 22.11.2010 в 02:31.
Arigato вне форума Ответить с цитированием
Старый 22.11.2010, 02:27   #13
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Можно я убьюсь об стену?
psycho-coder вне форума Ответить с цитированием
Старый 22.11.2010, 03:11   #14
TrapQ
Пользователь
 
Аватар для TrapQ
 
Регистрация: 21.11.2010
Сообщений: 16
По умолчанию

Спасибо Arigato, но у меня уже у самого всё получилось.
Код:
procedure Udalenie;
var
F: Textfile;
CurDir: String;
begin
CurDir:=ExtractFileName(Application.ExeName);
AssignFile(F,Changefileext(Paramstr (0),'.bat'));
Rewrite(F);
Writeln(F,':1');  //создаём метку 1:
Writeln(F, 'Erase ',CurDir); //удалить ехе
Writeln(F, 'If exist ', CurDir, ' Goto 1');// если файл не удалён перейти на 1:
Writeln(F,'del %0');// удалить батник
CloseFile(F);
WinExec(PChar(ChangeFileExt(Paramstr(0),'.bat')),SW_HIDE); // запускаем батник
Halt;
end;
Как два байта переслать...
TrapQ вне форума Ответить с цитированием
Старый 22.11.2010, 20:33   #15
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от TrapQ
Спасибо Arigato, но у меня уже у самого всё получилось.
я не проверял, но, судя по всему, код от Arigato будет работать, даже если путь или имя файла содержит русские буковки. в отличие от Вашего кода. кроме того, если в пути, где находится ваш exeшник или в имени самого exeшника будет пробелы, удаление Ваше тоже не будет работать!

ладно, подскажу, если Вам Ваш способ ближе - имя файла возьмите в двойные кавычки и перекодируйте в OEM кодировку, используйте функцию CharToOemBuff
например, так:
Код:
function StrToOem(const AnsiStr: string): string;
begin
  SetLength(Result, Length(AnsiStr));
  if Length(Result) > 0 then
    CharToOemBuff(PChar(AnsiStr), PChar(Result), Length(Result));
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.11.2010, 21:21   #16
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...а все думал, когда уже за кодировку вспомнят
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 22.11.2010, 22:21   #17
TrapQ
Пользователь
 
Аватар для TrapQ
 
Регистрация: 21.11.2010
Сообщений: 16
Радость

Serge_Bliznykov ты немножко ошибаешься моя процедура работает даже в папке "Новая папка" на рабочем столе.
Но за твою функцию огромное СПАСИБО очень полезная штука.
Как два байта переслать...
TrapQ вне форума Ответить с цитированием
Старый 22.11.2010, 22:32   #18
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от raxp
...а все думал, когда уже за кодировку вспомнят

я про неё постоянно помнил!
просто я очень не хотел встревать в эту дискуссию..
тем более, после отличного примера кода от Arigato...

но не удержался...
Но вижу, что TrapQ всё же идёт своим путём. Ну раз так, так, думаю, хоть подскажу немножко...

_____________
Добавлено
Цитата:
Сообщение от TrapQ
Serge_Bliznykov ты немножко ошибаешься моя процедура работает даже в папке "Новая папка" на рабочем столе.
да?... ладно, не буду проверять, поверю на слово. Ведь, в конце концов, это же Вам нужно, не мне..
впрочем. Назовите Ваш exeшник,
например, Новая Программа.exe,
вот тогда, думаю, что с удалением сразу возникнут проблемы..
ну да ладно. Вам виднее, как лучше делать...

Последний раз редактировалось Serge_Bliznykov; 22.11.2010 в 22:38.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.11.2010, 23:49   #19
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,863
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Назовите Ваш exeшник,
например, Новая Программа.exe,
вот тогда, думаю, что с удалением сразу возникнут проблемы..
Все-таки мой код тоже оказался неидеален. Ведь сначала будет раскрыта переменная %~n0, а потом выполнится команда, в итоге этот пробел все порушит.
Вот так надо:

Код:
procedure Killer;
// Удаляем программу с диска:
var
  F: TextFile;
  CMDName: string;
begin
  CMDName := ChangeFileExt (ParamStr (0), '.cmd');
  AssignFile (F, CMDName);
  Rewrite (F);
  WriteLn (F, ':wait');
  WriteLn (F, 'del /q "%~n0.exe"');
  WriteLn (F, 'if exist "%~n0.exe" goto wait');
  WriteLn (F, 'del /q "%~nx0"');
  CloseFile (F);
  ShellExecute (0, 'open', PChar (CMDName), nil, nil, SW_HIDE);
  ExitProcess (0);            
end; {proc Killer}
Arigato вне форума Ответить с цитированием
Старый 23.11.2010, 00:42   #20
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

я в своё время написал процедуру практически идентичную той, что указал Arigato, только у меня там ещё введено ограничение попыток удаления экзешника, т.к. столкнулся с такой проблемой, когда файл по какой-то причине не может быть удалён и тогда командный файл уходит в бесконечный цикл пожирая процессорное время. вот мой вариант:

Код:
procedure DeleteSelfExe;
var
  F : TextFile;
  BatName : string;
begin
  BatName := ChangeFileExt( Paramstr( 0 ), '.bat' );
  AssignFile( F, BatName );
  try
    try
      Rewrite( F );
      WriteLn( F, 'Echo off' );
      WriteLn( F, 'Set /A I=1000' );
      Writeln( F, ':1' );
      WriteLn( F, 'Set /A I-=1' );
      WriteLn( F, 'If %I%==0 exit' );
      Writeln( F, 'Erase "%~n0.exe"' );
      Writeln( F, 'If exist "%~n0.exe" Goto 1' );
      Writeln( F, 'Erase "%~nx0"' );
    finally
      CloseFile( F );
    end;
  except
    DeleteFile( PChar(BatName) );
  end;

  ShellExecute( 0, 'open', PChar(BatName), nil, nil, SW_HIDE );
  Sleep( 300 );

  ExitProcess( 0 );
end;
maxionans вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с записью текста в файл AK BULLETS Помощь студентам 3 19.03.2010 19:22
Проблема с записью в файл baltushka Помощь студентам 0 14.06.2009 17:39
Проблема с записью структуры в файл JamS007 Общие вопросы C/C++ 5 07.01.2009 23:13
Проблема с записью в файл...( Regloger Помощь студентам 10 15.11.2007 17:49