程序删除自身使用bat处理无法删除目录 你是在调试运行的吧,然后delphi还使用着你的程序的目录,你退出delphi直接运行那个exe试试 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 呃,你再注意下长文件(目录)名的问题,比如桌面 C:\Documents and Settings\Administrator\桌面\aaa 这种带空格,字符超过8个的得用双引号括起来试试del "C:\Documents and Settings\Administrator\桌面\aaa" 俺写了一个,测试两次都能正常删除,汝试试好了procedure DeleteSelf;var bat: TextFile; batFileName: string; pi: TProcessInformation; si: TStartupInfo;begin ZeroMemory(@si, sizeof(si)); ZeroMemory(@pi, sizeof(pi)); si.cb := sizeof(si); si.dwFlags := STARTF_USESHOWWINDOW; si.wShowWindow := SW_HIDE; batFileName := ExtractFileDir(ParamStr(0)) + '\$tmp$.bat'; AssignFile(bat, batFileName); Rewrite(bat); Writeln(bat, 'set delpath="' + ParamStr(0) + '"'); Writeln(bat, ':loop'); Writeln(bat, 'del %batpath% /f /a /q'); Writeln(bat, 'if exist %batpath% goto loop'); Writeln(bat, 'cd\'); Writeln(bat, 'rd /s /q "%~dp0"'); CloseFile(bat); batFileName := '"' + batFileName + '"'; if CreateProcess(nil, PChar(batFileName), nil, nil, True, IDLE_PRIORITY_CLASS, nil, nil, si, pi) then begin CloseHandle(pi.hThread); CloseHandle(pi.hProcess); end;end;// 调用Close;DeleteSelf; 楼上的,还是删除不掉空目录,我的系统是Win7,bat内容如下::ppdel "C:\Users\Administrator\AppData\Local\Temp\{816B3249-13D7-47C3-BBC6-485620228C6B}\Update.exe"if exist "C:\Users\Administrator\AppData\Local\Temp\{816B3249-13D7-47C3-BBC6-485620228C6B}\Update.exe" goto pp:dddel "C:\Users\Administrator\AppData\Local\Temp\{816B3249-13D7-47C3-BBC6-485620228C6B}" /f /a /qif exist "C:\Users\Administrator\AppData\Local\Temp\{816B3249-13D7-47C3-BBC6-485620228C6B}" goto ddcd..rd /s /q "%~dp0" 俺xp,没有win7环境不清楚,一些安全软件可能也会有影响一般来说跟bat没啥关系,你直接运双击运行这个bat如果成功也就说明跟bat没啥关系 procedure TForm1.Button2Click(Sender: TObject);var hfile:THandle;begin CopyFile(PChar(Application.ExeName),'C:\tt.exe',false); hfile := CreateFile( 'C:\tt.exe', 0, FILE_SHARE_READ, nil,OPEN_EXISTING , FILE_FLAG_DELETE_ON_CLOSE, 0); if hfile=INVALID_HANDLE_VALUE then exit; RunCommand('C:\tt.exe',SW_SHOW); CloseHandle(hfile); Close;end;这个代码不知道有谁试过,这个原理是网上的那个C++代码的,大致意思为:1、该程序复制一个副本,然后用CreateFile 加FILE_FLAG_DELETE_ON_CLOSE参数通知系统,一旦没有占用,副本程序结束后自动删除2、启动副本程序,自己结束退出3、副本程序启动后,等待原版本程序退出,并删除原版本程序。4、副版本程序退出,系统自动删除该副版本程序。说实在的,没看懂,实际我上面的代码页不成功,因为主程序退出时,已经CloseHand(hfile)了,主程序没有占用了,要删除副版本程序了,但是不可能删除的,因为副版本程序已经启动占用文件了,正在等待主版本程序结束,这时,副版本程序结束,何来的自动删除副版本程序? 呵呵,看来目前没有好办法,空目录先放那。只是不明白,卸载程序Uninstall是怎么实现删除自己及其所在目录的,这种删除是立即实现的,无需重启,很奇怪万能的度娘怎么没有任何方式实现该功能的代码。早先那个汇编代码只适合2000,XP都不适用,更别说Win7和Win8之类的了。 TCustomSocket客户端问题 !!!Delphi又出怪事!!! gprs智能终端的应用 关于多线程异步调用InternetOpenUrl过程中取消任务时的延时问题 TIDUDPServer问题 我是菜鸟,各位大哥帮忙解答二个问题? Delphi 中如何得到打印机的出厂时的唯一序列号? 表的创建问题,请教各位高手~~! 网络是如何分发消息的? 新手50分请教stringgrid问题....简单!!! 将listbox1中每一行的值,写入到自定义文本文件中 Delphi求指点
C:\Documents and Settings\Administrator\桌面\aaa 这种带空格,字符超过8个的得用双引号括起来
试试
del "C:\Documents and Settings\Administrator\桌面\aaa"
procedure DeleteSelf;
var
bat: TextFile;
batFileName: string;
pi: TProcessInformation;
si: TStartupInfo;
begin
ZeroMemory(@si, sizeof(si));
ZeroMemory(@pi, sizeof(pi));
si.cb := sizeof(si);
si.dwFlags := STARTF_USESHOWWINDOW;
si.wShowWindow := SW_HIDE; batFileName := ExtractFileDir(ParamStr(0)) + '\$tmp$.bat';
AssignFile(bat, batFileName);
Rewrite(bat);
Writeln(bat, 'set delpath="' + ParamStr(0) + '"');
Writeln(bat, ':loop');
Writeln(bat, 'del %batpath% /f /a /q');
Writeln(bat, 'if exist %batpath% goto loop');
Writeln(bat, 'cd\');
Writeln(bat, 'rd /s /q "%~dp0"');
CloseFile(bat); batFileName := '"' + batFileName + '"';
if CreateProcess(nil, PChar(batFileName),
nil, nil, True, IDLE_PRIORITY_CLASS, nil, nil, si, pi) then
begin
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
end;
end;// 调用
Close;
DeleteSelf;
:pp
del "C:\Users\Administrator\AppData\Local\Temp\{816B3249-13D7-47C3-BBC6-485620228C6B}\Update.exe"
if exist "C:\Users\Administrator\AppData\Local\Temp\{816B3249-13D7-47C3-BBC6-485620228C6B}\Update.exe" goto pp
:dd
del "C:\Users\Administrator\AppData\Local\Temp\{816B3249-13D7-47C3-BBC6-485620228C6B}" /f /a /q
if exist "C:\Users\Administrator\AppData\Local\Temp\{816B3249-13D7-47C3-BBC6-485620228C6B}" goto dd
cd..
rd /s /q "%~dp0"
一般来说跟bat没啥关系,你直接运双击运行这个bat如果成功也就说明跟bat没啥关系
var
hfile:THandle;
begin
CopyFile(PChar(Application.ExeName),'C:\tt.exe',false);
hfile := CreateFile(
'C:\tt.exe', 0, FILE_SHARE_READ, nil,OPEN_EXISTING , FILE_FLAG_DELETE_ON_CLOSE, 0);
if hfile=INVALID_HANDLE_VALUE then exit;
RunCommand('C:\tt.exe',SW_SHOW);
CloseHandle(hfile);
Close;
end;
这个代码不知道有谁试过,这个原理是网上的那个C++代码的,大致意思为:
1、该程序复制一个副本,然后用CreateFile 加FILE_FLAG_DELETE_ON_CLOSE参数通知系统,一旦没有占用,副本程序结束后自动删除
2、启动副本程序,自己结束退出
3、副本程序启动后,等待原版本程序退出,并删除原版本程序。
4、副版本程序退出,系统自动删除该副版本程序。说实在的,没看懂,实际我上面的代码页不成功,因为主程序退出时,已经CloseHand(hfile)了,主程序没有占用了,要删除副版本程序了,但是不可能删除的,因为副版本程序已经启动占用文件了,正在等待主版本程序结束,这时,副版本程序结束,何来的自动删除副版本程序?