delphi如何删除目录和目录下的所有文件
之前看到有个循环删除目录下的文件,再删目录的,但不能删除,因为在循环目录里的文件的时候,就占用了该目录,删除完里面的文件后,目录依然处于被使用状态,不能删除,delphi...
之前看到有个循环删除目录下的文件,再删目录的,但不能删除,因为在循环目录里的文件的时候,就占用了该目录,删除完里面的文件后,目录依然处于被使用状态,不能删除,delphi又没有释放被占用的目录的函数
3楼的是不行的,我用的不是递归,是循环,也用了findclose(rs); 但当前文件夹还是处于被使用状态而无法删除;
谢谢大家的回答,分数只能给一楼了 展开
3楼的是不行的,我用的不是递归,是循环,也用了findclose(rs); 但当前文件夹还是处于被使用状态而无法删除;
谢谢大家的回答,分数只能给一楼了 展开
4个回答
展开全部
没必要去循环删除,速度很慢,直接调用api就行了,如下,直接在uses shellapi之后,调用SHMyDelDirectory去删除你的目录.
function SHMyDelDirectory(const Source: string): boolean;
var
fo: TSHFILEOPSTRUCT;
begin
FillChar(fo, SizeOf(fo), 0);
with fo do
begin
Wnd := 0;
wFunc := FO_Delete;
pFrom := PChar(Source + #0);
pTo := #0#0;
fFlags := FOF_NOCONFIRMATION + FOF_SILENT;
end;
Result := (SHFileOperation(fo) = 0);
end;
function SHMyDelDirectory(const Source: string): boolean;
var
fo: TSHFILEOPSTRUCT;
begin
FillChar(fo, SizeOf(fo), 0);
with fo do
begin
Wnd := 0;
wFunc := FO_Delete;
pFrom := PChar(Source + #0);
pTo := #0#0;
fFlags := FOF_NOCONFIRMATION + FOF_SILENT;
end;
Result := (SHFileOperation(fo) = 0);
end;
更多追问追答
追问
你这程序不行,该目录正被程序占用,所以不能删除的
追答
已经测试过的(测试环境 win7 64bit / Delphi 2007),没什么问题,即使是你是我的电脑中打开了这个目录,这个文件夹仍然可以被删除。除非你打开了这个目录下的某个文件
推荐于2018-03-08 · 知道合伙人数码行家
可以叫我表哥
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:25897
获赞数:1464983
2010年毕业于北京化工大学北方学院计算机科学与技术专业毕业,学士学位,工程电子技术行业4年从业经验。
向TA提问 私信TA
关注
展开全部
使用递归调用。深入文件夹中删掉文件,然后再删文件夹,然后再逐层返回。
function DeleteFile(mDirName: string; Ext: String = '*'): Boolean;
var
vSearchRec: TSearchRec;
vPathName, tmpExt: string;
K: Integer;
begin
Result := true;
tmpExt := Ext;
if Pos('.', tmpExt) = 0 then
tmpExt := '.' + tmpExt;
vPathName := mDirName + '\*.*';
K := FindFirst(vPathName, faAnyFile, vSearchRec);
while K = 0 do
begin
if (vSearchRec.Attr and faDirectory > 0) and
(Pos(vSearchRec.Name, '..') = 0) then
begin
FileSetAttr(mDirName + '\' + vSearchRec.Name, faDirectory);
Result := DeletePath(mDirName + '\' + vSearchRec.Name, Ext);
end
else if Pos(vSearchRec.Name, '..') = 0 then
begin
FileSetAttr(mDirName + '\' + vSearchRec.Name, 0);
if ((CompareText(tmpExt, ExtractFileExt(vSearchRec.Name)) = 0) or (CompareText(tmpExt, '.*') = 0)) then
Result := DeleteFile(PChar(mDirName + '\' + vSearchRec.Name));
end;
if not Result then
Break;
K := FindNext(vSearchRec);
end;
FindClose(vSearchRec);
end;
function DeleteFile(mDirName: string; Ext: String = '*'): Boolean;
var
vSearchRec: TSearchRec;
vPathName, tmpExt: string;
K: Integer;
begin
Result := true;
tmpExt := Ext;
if Pos('.', tmpExt) = 0 then
tmpExt := '.' + tmpExt;
vPathName := mDirName + '\*.*';
K := FindFirst(vPathName, faAnyFile, vSearchRec);
while K = 0 do
begin
if (vSearchRec.Attr and faDirectory > 0) and
(Pos(vSearchRec.Name, '..') = 0) then
begin
FileSetAttr(mDirName + '\' + vSearchRec.Name, faDirectory);
Result := DeletePath(mDirName + '\' + vSearchRec.Name, Ext);
end
else if Pos(vSearchRec.Name, '..') = 0 then
begin
FileSetAttr(mDirName + '\' + vSearchRec.Name, 0);
if ((CompareText(tmpExt, ExtractFileExt(vSearchRec.Name)) = 0) or (CompareText(tmpExt, '.*') = 0)) then
Result := DeleteFile(PChar(mDirName + '\' + vSearchRec.Name));
end;
if not Result then
Break;
K := FindNext(vSearchRec);
end;
FindClose(vSearchRec);
end;
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
循环可以,我是直接在直写的,可能有语法错误
function deldir(dirname:string):boolean;
var
rs:tsearchrec;
path:string;
begin
result := true;
try
path := dirname;
if path[length(path)] <> '\' then path := path + '\';
if findfirst(path+'*.*',faanyfile,rs) = 0 then begin
repeat
if (rs.name='.')or(rs.name='..') then continue;
if rs.attr or fadirectory = fadirectory then begin
if deldir(path+rs.name) then // 先递归进入这个目录删除里面的文件,在里面findfirst并 findclose
rmdir(path+rs.name); // 退出递归后再删除目录
end else
deletefile(path+rs.name);
until findnext(rs)<>0;
end;
findclose(rs); // 这个一定要
except end;
end;
function deldir(dirname:string):boolean;
var
rs:tsearchrec;
path:string;
begin
result := true;
try
path := dirname;
if path[length(path)] <> '\' then path := path + '\';
if findfirst(path+'*.*',faanyfile,rs) = 0 then begin
repeat
if (rs.name='.')or(rs.name='..') then continue;
if rs.attr or fadirectory = fadirectory then begin
if deldir(path+rs.name) then // 先递归进入这个目录删除里面的文件,在里面findfirst并 findclose
rmdir(path+rs.name); // 退出递归后再删除目录
end else
deletefile(path+rs.name);
until findnext(rs)<>0;
end;
findclose(rs); // 这个一定要
except end;
end;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以使用 delphi JVCL JVCL是由超过500个可视及不可视组件组成的库 ,可以参考其中代码
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询