你是在调试运行的吧,然后delphi还使用着你的程序的目录,你退出delphi直接运行那个exe试试

解决方案 »

  1.   

    呃,你再注意下长文件(目录)名的问题,比如桌面 
    C:\Documents and Settings\Administrator\桌面\aaa  这种带空格,字符超过8个的得用双引号括起来
    试试
    del "C:\Documents and Settings\Administrator\桌面\aaa"
      

  2.   

    俺写了一个,测试两次都能正常删除,汝试试好了
    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;
      

  3.   

    楼上的,还是删除不掉空目录,我的系统是Win7,bat内容如下:
    :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"
      

  4.   

    俺xp,没有win7环境不清楚,一些安全软件可能也会有影响
    一般来说跟bat没啥关系,你直接运双击运行这个bat如果成功也就说明跟bat没啥关系
      

  5.   

    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)了,主程序没有占用了,要删除副版本程序了,但是不可能删除的,因为副版本程序已经启动占用文件了,正在等待主版本程序结束,这时,副版本程序结束,何来的自动删除副版本程序?
      

  6.   

    呵呵,看来目前没有好办法,空目录先放那。只是不明白,卸载程序Uninstall是怎么实现删除自己及其所在目录的,这种删除是立即实现的,无需重启,很奇怪万能的度娘怎么没有任何方式实现该功能的代码。早先那个汇编代码只适合2000,XP都不适用,更别说Win7和Win8之类的了。