windows删除文件c语言函数,技术分享 - 使用MoveFileEx函数实现重启删除文件

背景

在使用一些管理监控软件的时候,都会发现这些软件里都会提供这样的一个功能:重启删除文件。也就是,让计算机重启之后,立马删除文件。删除发生在AUTOCHK执行之后,在页面文件创建之前。而此时用户还没有完全的进入操作系统,所以可以应用这点删除那些正常情况下很难删除的文件甚至是页面文件。

起初,我还以为这种技术实现起来很难。想不明白如何设置重启之后,程序会自动删除指定文件,是将信息存储在注册表里?还是存储在某个特殊的文件里?答案其实都不是。Windows已经给我们提供了现成的API函数给我们使用,用来实现这个功能,我们只需熟练地调用它就可以了。这个API函数就是:MoveFileEx。

现在,我把程序实现思路和过程写成文档,分享给大家。

函数介绍函数声明

BOOLMoveFileEx(

LPCTSTR lpExistingFileName,// file name

LPCTSTR lpNewFileName,// new file name

DWORD dwFlags// move options

);

参数

lpExistingFileName:一个存在的文件或者文件夹字符串指针

lpNewFileName :一个还没存在的文件或者文件夹的字符串指针

dwFlags :一个或多个下述常数:

VALUE

MEANING

MOVEFILE_REPLACE_EXISTING

覆盖已存在的目标文件,如果来源文件和目标文件指定的是一个目录,则不能使用此标记

MOVEFILE_COPY_ALLOWED

如果目标文件被移动到不同的卷上,则函数通过拷贝后删除来源文件的方法来模拟移动文件操作

MOVEFILE_DELAY_UNTIL_REBOOT

在系统重新启动前,不执行移动操作,直到系统启动后,磁盘检测完毕后,创建页面文件之前,执行移动操作。因此,这个参数可以删除系统之前启用的页面文件。这个参数只能被拥有 管理员权限 或 LocalSystem权限 的程序使用。这个参数不能和 MOVEFILE_COPY_ALLOWED 一起使用

MOVEFILE_WRITE_THROUGH

这个标记允许函数在执行完文件移动操作后才返回,否者不等文件移动完毕就直接返回。如果设置了 MOVEFILE_DELAY_UNTIL_REBOOT 标记,则 MOVEFILE_WRITE_THROUGH 标记将被忽略

MOVEFILE_CREATE_HARDLINK

系统保留,以供将来使用

MOVEFILE_FAIL_IF_NOT_TRACKABLE

如果来源文件是一个 LINK 文件,但是文件在移动后不能够被 TRACKED,则函数执行失败。如果目标文件在一个 FAT 格式的文件系统上,则上述情况可以发生。这个参数不支持 NT 系统

返回值

执行成功,返回TRUE;否则返回FALSE。

说明

MoveFileEx 函数在 ANSI 版本中,文件名长度被限制在 MAX_PATH 个字符内,为了将这个这个限制扩展到 32767 个宽字符长度,请使用 UNICODE 版本的函数,并且使用“//?/”作为路径前缀。

在 WINDOWS 20000 中,如果你使用了“//?/”前缀,则不能使用 MOVEFILE_DELAY_UNTIL_REBOOT 标记。

当你移动一个文件时,目标文件和来源文件可能在不同文件系统或卷上,如果目标文件在其他驱动器上,你必须指定 MOVEFILE_COPY_ALLOWED 标记。

如果移动的是一个目录,则目标目录必须和来源目录在同一个驱动器上。

如果指定了 MOVEFILE_DELAY_UNTIL_REBOOT 标记,而且目标文件指定为空路径,则来源文件将在系统启动时被删除。如果来源文件指定的是一个空目录,则来源目录将在系统启动时被删除,如果是非空目录,则无法删除。

实现原理

MoveFileEx 函数不单单可以用来删除文件,同样可以用来移动文件。本文只介绍重启删除文件的例子,对于其它功能的开发探索,在此就不进行深究了。

重启删除的实现原理就是:

使用 MoveFileEx 函数的 MOVEFILE_DELAY_UNTIL_REBOOT 标志,实现重启后删除文件。注意文件的移动是发生在 AUTOCHK执行之后,在页面文件创建之前。而此时用户还没有完全的进入操作系统,所以可以应用这点删除那些正常情况下很难删除的文件甚至是页面文件。很多杀毒软件和一些恶意程序删除工具就是利用了 MoveFileEx函数的这个特性来实现的重启后删除病毒。

同时,需要注意的就是:

删除文件的路径开头需要加上“\\\\?\\”的前缀。

设置重启删除成功后,一定要重启,不能是关机或是其它操作。

程序运行的时候,需要以“管理员权限”运行。

编程实现BOOLRebootDelete(char*pszFileName)

{

// 重启删除文件

charszTemp[MAX_PATH]="\\\\?\\";

::lstrcat(szTemp,pszFileName);

BOOL bRet=::MoveFileEx(szTemp,NULL,MOVEFILE_DELAY_UNTIL_REBOOT);

returnbRet;

}

程序测试

在 main 函数中,调用上述封装好的函数,进行测试。

main 函数为:

int_tmain(intargc,_TCHAR*argv[])

{

if(FALSE==RebootDelete("C:\\Users\\DemonGan\\Desktop\\520.exe"))

{

printf("Set Reboot Delete Error.\n");

}

else

{

printf("Set Reboot Delete OK.\n");

}

system("pause");

return0;

}

测试结果:

程序“以管理员身份运行程序”,提示执行成功,然后,直接点击“重启”计算机。

bc58e4afa5447ae6cfccb23253d8c6b2.png

重启之后,文件删除成功。

总结

重启后删除文件,这一功能的实现。仅仅是一个 MoveFileEx 函数就可以实现。但是,在使用这个函数的过程中,需要注意以下几点:

删除文件的路径开头需要加上“\\\\?\\”的前缀

设置重启删除成功后,一定要重启,不能是关机或是其它操作

程序运行的时候,需要以“管理员权限”运行

参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值