网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月03日漏签0天
delphi吧 关注:17,478贴子:81,700
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 6回复贴,共1页
<<返回delphi吧
>0< 加载中...

delphi强制删除正在运行的文件或程序(小弟跪求各位高手!)

  • 收藏

  • 回复
  • 222.67.136.*
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我想大家都知道,当某个文件或程序正在被调用时(如部分病毒所加载的dll文件)正常情况下是不能删除的,除非你结束相应的调用进程或线程,或通过第三方工具如冰刃强制删除,那能否在delphi下实现呢,查了很多资料,有的说是利用api函数,有的说是强制改变文件名称,然后再删,但总找不到一个完整的程序,请教高手如何在delphi下实现这个强制删除功能,最好能附上代码,不甚感激!


  • 索引越界
  • 核心吧友
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
這個是深入windows核心編程裏提供的代碼(刪除或移動正在使用的文件)如下:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls;
 
const
 FILE_DELETE=1;
 FILE_RENAME=2;
type
 TForm1 = class(TForm)
 Button1: TButton;
 Label1: TLabel;
 Label2: TLabel;
 RadioGroup1: TRadioGroup;
 Edit1: TEdit;
 Edit2: TEdit;
 Button2: TButton;
 Button3: TButton;
 OpenDialog1: TOpenDialog;
 procedure Button2Click(Sender: TObject);
 procedure Button3Click(Sender: TObject);
 procedure Button1Click(Sender: TObject);
 procedure Edit2Change(Sender: TObject);
 procedure RadioGroup1Click(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

Function DeleteRenameFileAfterBoot(lpFileNameToSrc,lpFileNameToDes: PChar;flag:Uint): Boolean;
var
 WindowsDirs: array [0..MAX_PATH + 1] of Char;
 lpDirSrc,lpDirDes: array [0..MAX_PATH + 1] of Char;
 VerPlatForm: TOSVersionInfoA;
 StrLstDelte: TStrings;
 filename,s :String;
 i:integer;
begin
 Result := FALSE;
 ZeroMemory(@VerPlatForm, SizeOf(VerPlatForm));
 VerPlatForm.dwOSVersionInfoSize := SizeOf(VerPlatForm);
 GetVersionEx(VerPlatForm);
 if VerPlatForm.dwPlatformId = VER_PLATFORM_WIN32s then
 begin
 SetLastError(ERROR_NOT_SUPPORTED);
 Exit;
 end
 else if VerPlatForm.dwPlatformId = VER_PLATFORM_WIN32_NT then
 begin
 if flag=FILE_DELETE then
 Result := MoveFileEx(PChar(lpFileNameToSrc), nil,
 MOVEFILE_REPLACE_EXISTING + MOVEFILE_DELAY_UNTIL_REBOOT)
 else if (flag=FILE_RENAME) then
 Result := MoveFileEx(lpFileNameToSrc, lpFileNameToDes,
 MOVEFILE_REPLACE_EXISTING + MOVEFILE_DELAY_UNTIL_REBOOT);
 end
 else begin
 StrLstDelte := TStringList.Create;
 GetWindowsDirectory(WindowsDirs, MAX_PATH + 1);
 filename:=WindowsDirs;
 if filename[length(filename)]<>'\' then filename:=filename+'\';
 filename:=filename+'wininit.ini';
 if FileExists(filename) then
 StrLstDelte.LoadFromFile(filename);
 if StrLstDelte.IndexOf('[rename]') = -1 then
 StrLstDelte.Add('[rename]');
 GetShortPathName(lpFileNameToSrc, lpDirSrc, MAX_PATH + 1);
 if fileexists(lpFileNameToDes) then
 GetShortPathName(lpFileNameToDes, lpDirDes, MAX_PATH + 1)
 else begin
 s:=extractfilename(lpFileNameToDes);
 i:=pos('.',s);
 if (i=0) then
 begin
 if length(s)>8 then raise exception.create('不是有效的短文件名(8+3格式)!');
 end
 else begin
 if (i-1>8)or(length(s)-i>3) then raise exception.create('不是有效的短文件名(8+3格式)!');
 end;
 strcopy(lpDirDes,lpFileNameToDes);
 end;
 if (flag=FILE_DELETE) then {刪除}
 StrLstDelte.Insert(StrLstDelte.IndexOf('[rename]') + 1, 'NUL='+string(lpDirSrc))
 else if (flag=FILE_RENAME) then {改名}
 StrLstDelte.Insert(StrLstDelte.IndexOf('[rename]') + 1, string(lpDirDes)+'='+string(lpDirSrc));

 StrLstDelte.SaveToFile(filename);
 Result := TRUE;
 StrLstDelte.Free;
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if OpenDialog1.Execute then
 edit1.text:=OpenDialog1.FileName;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 if OpenDialog1.Execute then
 edit2.text:=OpenDialog1.FileName;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 i:uint;
begin
 if RadioGroup1.ItemIndex=0 then i:=FILE_DELETE
 else i:=FILE_RENAME;
 if edit1.text='' then raise exception.create('源文件爲空!');
 if (i=FILE_RENAME)and(edit2.text='') then raise exception.create('目標文件爲空!');
 if not DeleteRenameFileAfterBoot(pchar(edit1.text),pchar(edit2.text),i) then
 showmessage('出錯了')
 else showmessage('ok');
end;

procedure TForm1.Edit2Change(Sender: TObject);
var
 VerPlatForm: TOSVersionInfoA;
 buf: array [0..MAX_PATH + 1] of Char;
begin
 if not fileexists(edit2.text) then exit;
 ZeroMemory(@VerPlatForm, SizeOf(VerPlatForm));
 VerPlatForm.dwOSVersionInfoSize := SizeOf(VerPlatForm);
 GetVersionEx(VerPlatForm);
 if VerPlatForm.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS then
 begin
 GetShortPathName(pchar(edit2.text), buf, MAX_PATH + 1);
 edit2.text:=buf;
 end;
end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
 edit2.Enabled:=RadioGroup1.ItemIndex=1;
 button2.Enabled:=RadioGroup1.ItemIndex=1;
end;

end.





   我顛覆了整個世界,是爲了擺正你們的倒影




2025-07-03 10:12:45
广告
  • 索引越界
  • 核心吧友
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
還有一個思路是,使用命令chkdsk /x 就是磁盤檢測工具. 指定文件所在的邏輯盤運行以後,它會暫時卸掉這個邏輯區,這上面的文件都將會關閉,結束以後就可以刪除了.





   我顛覆了整個世界,是爲了擺正你們的倒影




  • farsail
  • 初级粉丝
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
楼主说得很对,就用enumprocess回调函数把所有进程的文件名找出来,看看哪个是你想删的就就把它进程杀掉就可以对其文件做任何事了
不过还有个别情况不好弄,就是在autoexec.bat中的文件或服务中所使用的文件不好弄


  • 爱恨DLP
  • 活跃吧友
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
对寄生病毒恐怕得另想办法,象冲击波


  • 222.67.136.*
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
to 2楼 多谢2楼兄弟指点,我先试一下
to 3楼 思路很新颖,值得尝试
to 4楼 其实你说的还是先结束相应的进程再删,而我的意思是在不结束进程的情况下删除相应文件或程序,冰刃就是最好的例子。

感谢所有回复的兄弟,愿大家都能实现自己的人生目


  • 阁吉吉
  • 初级粉丝
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Delphi7强制删除正在运行的程序
https://download.csdn.net/download/rang34/89560677


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 6回复贴,共1页
<<返回delphi吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示