C/C++ 如何删除或者粉碎一个正在被使用的文件

Code虫子 2011-01-18 07:12:10
近期再做一个项目,大体是用来收集图片的。我负责编写一个管理服务器,该服务器负责维持存储磁盘的存储空间。如果可用空间过小,则从存储时间最久的图片开始删除,知道可用空间达到要求为止。
但是在测试过程中,发现如果一个文件正在被使用,则无法删除。想要一种方法将这种文件也删除掉。我大致有以下几个想法,但都不知道怎么做:
(1)使用某种API函数,能够将该文件强制删除(这种方法最好,但不知道有没有这种函数)。
(2)想一个方法将该文件粉碎。(希望不大)。
(3)找到正在使用该文件的程序,将其强制关闭,然后删除文件。(有点苗头)。

请各位大侠多多指点啊,怎么做才好呢?
...全文
2321 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzjxylophone 2011-01-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 taodm 的回复:]

大型服务器运行的程序竟然要玩删除正在使用的文件?
这简直和自杀没多少区别。
[/Quote]

只能说有非常特殊的需求了,LZ在增加这个功能之前最好多想想
Code虫子 2011-01-19
  • 打赏
  • 举报
回复
谢谢,大家的激情讨论,我也觉着强制删除不太好。但是总会出现一些莫名其妙文件删除掉的问题,必须重启一下机器才能删除。郁闷,现在我的解决方法和Bokutake的差不多,先将删除失败的路径保存在链表里面,每次删除之前先要进行判断该路径下的文件是否能删除,如果不能则跳过去,如果没有记录,则进行删除。再定时将该链表进行清空,再次尝试删除那些没删除成功的文件。
只能这样退而求其次了
bottlerun 2011-01-19
  • 打赏
  • 举报
回复
要不你延迟一下吧,你先想下可能是什么程序正在占用这张图片
如果只是短时间的占用正好被你碰上了,你可以延迟个100MS 500MS 1S分别尝试3次删除,如果再不行就下次再删咯
MYMGrub 2011-01-19
  • 打赏
  • 举报
回复
我觉得是不是可以如果最久的那个文件在用就删掉次久的呀?人家用着文件呢,你莫名其妙就给删掉了??
taodm 2011-01-18
  • 打赏
  • 举报
回复
大型服务器运行的程序竟然要玩删除正在使用的文件?
这简直和自杀没多少区别。
辰岡墨竹 2011-01-18
  • 打赏
  • 举报
回复
正在使用的话就不要动它,否则可能会导致其它的程序出问题,而且有时候也不是驱动层就一定能解决,比如杀毒软件正占用的话,乱改文件可能会死机什么的。像Flickr什么的,图片一般到几十天之后还留着。
你最好用一个定时运行(比如每10分钟)的后台程序做清理,每次需要删除的东西写到一个文件了。让清理程序每次运行的时候尝试删除它。既然要删除比较旧的文件,也不用严格必须是最旧的,跳过几个也应该没问题吧。
另外其他的地方编程时读取图片尽量读完就关闭,不要一直打开着。
测试NULL 2011-01-18
  • 打赏
  • 举报
回复
http://wangliangffaflgh.download.csdn.net/
欢迎下载!
测试NULL 2011-01-18
  • 打赏
  • 举报
回复
那个资源里竟然有木马,我重新编译整理了一下,
放在 http://download.csdn.net/source/2990649
双击其中的一个批处理文件运行,中途如果被360等软件拦截,
点允许执行即可,请注意删除文件时做好备份,以免误删,呵呵。

欢迎大家下载,另外我那里还有一些资源与大家分享!

有爱的小止 2011-01-18
  • 打赏
  • 举报
回复
8楼的可以用么。。。。
辛鹤 2011-01-18
  • 打赏
  • 举报
回复
我已上传,http://download.csdn.net/source/2990555
ayw215 2011-01-18
  • 打赏
  • 举报
回复
强制删除文件得做驱动层的
辛鹤 2011-01-18
  • 打赏
  • 举报
回复
驱动级的可以:
void del_Friend()
{
char name[20];
//int temp;
cout << "\n请输入要删除的好友姓名:";
fflush(stdin);
cin.getline(name,20);
//strcat (name,"data");
FILE *fp;
if ( (fp = fopen(name,"r")) == NULL)
{
cout << "错误!不能删除文件或不存在该好友!\n";
cout << "按任意键返回主菜单。\n";
cin.get();
menu();
}
else
{
del_File(name);
/*cout << "删除成功!按任意键返回主菜单。\n";
cin.get();
menu();*/
}
}
void del_File(char name[])
{
char DEL[30] = "del ";
strcat (DEL,name);
system(DEL);
cout << "删除成功!按任意键返回主菜单。\n";
cin.get();
menu();
}

  • 打赏
  • 举报
回复
关闭正在打开的程序?首先你怎么也得关闭跟这个文件有关的所有句柄,然后用删除api
Code虫子 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kong_ling 的回复:]
重启后删除不行吗?MOVEFILE_DELAY_UNTIL_REBOOT
[/Quote]
这是在一个大型服务器运行的程序 不能随便重启
光跃 2011-01-18
  • 打赏
  • 举报
回复
重启后删除不行吗?MOVEFILE_DELAY_UNTIL_REBOOT
healer_kx 2011-01-18
  • 打赏
  • 举报
回复
当然没有这样的函数了,

这个需要驱动层的支持才能搞定所谓的粉碎。
sdfdsdfsfsd 2011-01-18
  • 打赏
  • 举报
回复
虽然我也不知道有没这个api
但是推荐你下unlocker看看

64,631

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧