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

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.
...全文
263 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
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 ....估计就没事了
加载更多回复(8)

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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