一个小程序的大错误:大家来捉虫

ccat 2001-06-24 05:51:00
我前几天写了一个Deltree,只要执行Deltree "目录名"就可以像MS的Deltree命令一样删指定目录,当时是找了程序员大本营光盘上的个函数,自己根据需要改了改就用了。昨晚偶然把它放在C:下的一个子目录下双击,结果它神不知鬼不觉地把C盘格了(或者说清空了)!就在Windows还在正常运行的情况下!现在兄弟已经找到了错,把错误代码拿出来。大家一起娱乐一下,找到错在哪儿就有分!
program deltree;

uses
SysUtils;

procedure DoDelTree(TheDir : String);
Var
Search : TSearchRec;
rec : word;
Begin
TheDir := IncludeTrailingBackslash(TheDir);
rec := FindFirst(TheDir + '*.*', faAnyFile, Search);
While rec = 0 Do
Begin
If Search.Name[1] <> '.' Then
Begin
// Is this a directory?
If (Search.Attr And faDirectory) = faDirectory Then
Begin
// If so, let's call DelTree again using this new
// directory as the TheDir parameter.
DoDelTree(TheDir + Search.Name);
// Not that all of the files are gone from this directoy,
// we can remove the directory.
Removedir(TheDir + Search.Name);
End
Else
Begin
// We found a file.
// Now lets reset its attributes so we don't have any problems
// deleting them.
FileSetAttr(TheDir + Search.Name, 0);
DeleteFile(TheDir + Search.Name);
End;
End;
rec := FindNext(Search);
End;
FindClose(Search);
{The author forgot remove the target directory. Let's do it.}
Removedir(TheDir);
End;
begin
DoDelTree(ParamStr(1));
end.
...全文
198 点赞 收藏 28
写回复
28 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
ccat 2001-06-27
My God!
在此郑重声明,大家一定不要不加参数运行这段代码!!!
对因此造成损失的同志,我在此致歉!
回复
ccat 2001-06-27
My God!
在此郑重声明,大家一定不要不加参数运行这段代码!!!
对因此造成损失的同志,我在此致歉!
回复
ccat 2001-06-27
My God!
在此郑重声明,大家一定不要不加参数运行这段代码!!!
对因此造成损失的同志,我在此致歉!
回复
王集鹄 2001-06-27
我调试了你的代码
我的C也完了
回复
ccat 2001-06-27
我有一个意外的发现,就是这么删文件速度极快,比windows和dos下的绝大部分命令都快,快赶上format .../q了。
回复
InsideDelphi 2001-06-27
有道理,不过说实话你的程序我只是草草的看了一下,然后觉得和我以前写的不一样,就回答了。
回复
machin 2001-06-27
你的参数为空,所以指定的路径变成了'\',因此你c;就完蛋了。。。呵呵。。
回复
ccat 2001-06-27
有些同志回答的很有水平,超出了我的预期,希望各位高手继续指教噢。
回复
ccat 2001-06-27
没有的事啊?我什么时候愚弄大家了?只是认为这个程序很有意思,想和大家交流一下罢了,你说我一下把分给了,还有人看吗?:)
回复
kylix2001 2001-06-27
to:ccat(阿猫) & agui(阿贵) :
我觉得应该去掉的语句是: Removedir(TheDir + Search.Name);
而不是 Removedir(TheDir);
Removedir(TheDir + Search.Name);这一句很没必要,是不是?
因为在递归调用DoDelTree(TheDir + Search.Name)时,已经执行了
Removedir(TheDir + Search.Name) 了。

回复
kylix2001 2001-06-27
嘿嘿。是不是Windows默认的当前目录是C:\windows啊?(差不多每次进入DOS方式都是这样),你的paramstr(1)为空,所以就从C:\windows开始。。。
回复
InsideDelphi 2001-06-27
ccat你的心情我也理解,我回答了别人的文章大概有5、6页了吧,现在得分也不过400不到。
我认为,别人不给分,主要是我们自己没有做好。
你这样愚弄大家,是不对的。
回复
Manwill 2001-06-27
无聊
回复
myxfang 2001-06-27
gz
回复
cobi 2001-06-27
gz
回复
ccat 2001-06-27
放心,我一定会给分的。既然是给大家娱乐,当然要更多的人快乐一点好啦……也为了纪念我回的那么多没给我分的贴子……
回复
InsideDelphi 2001-06-27
可是我说的是对的呀!
回复
ccat 2001-06-27
在等人再多一点。
回复
InsideDelphi 2001-06-26
ccat怎么不看我的呢?
回复
InsideDelphi 2001-06-25
问题在下面这行
If Search.Name[1] <> '.' Then ....
如果你在cmd提示下用Dir,你会发现空目录有两个目录,<.>和<..>
.表示当前目录
..表示上一级目录
跑道C:\temp底下去,呵呵,上一级目录可是更目录呀
为什么从C:\Windows开始删呢
估计是这样
C:\Temp-->C:\Temp\..(C:\)->C:\Windows
和查找的次系有关
把If Search.Name[1] <> '.'改为if (Search.Name[1]<>'.') and (Search.name[1]<>'..') then ....估计就没事了
回复
加载更多回复
相关推荐
发帖
Delphi
创建于2007-08-02

4895

社区成员

Delphi 开发及应用
申请成为版主
帖子事件
创建了帖子
2001-06-24 05:51
社区公告
暂无公告