delphi如何删除目录和目录下的所有文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi如何删除目录和目录下的所有文件相关的知识,希望对你有一定的参考价值。

之前看到有个循环删除目录下的文件,再删目录的,但不能删除,因为在循环目录里的文件的时候,就占用了该目录,删除完里面的文件后,目录依然处于被使用状态,不能删除,delphi又没有释放被占用的目录的函数
3楼的是不行的,我用的不是递归,是循环,也用了findclose(rs); 但当前文件夹还是处于被使用状态而无法删除;
谢谢大家的回答,分数只能给一楼了

没必要去循环删除,速度很慢,直接调用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;追问

你这程序不行,该目录正被程序占用,所以不能删除的

追答

已经测试过的(测试环境 win7 64bit / Delphi 2007),没什么问题,即使是你是我的电脑中打开了这个目录,这个文件夹仍然可以被删除。除非你打开了这个目录下的某个文件

追问

之前确实有使用目录下的文件,但当我要删除这个目录时,
目录下已为空,还有可能有文件被打开吗?

追答

你自己去按del删一下这个目录看看,如果这样都不能删,那程序也删不了的。

参考技术A 使用递归调用。深入文件夹中删掉文件,然后再删文件夹,然后再逐层返回。

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;
参考技术B 循环可以,我是直接在直写的,可能有语法错误
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;
参考技术C 你可以使用 delphi JVCL JVCL是由超过500个可视及不可视组件组成的库 ,可以参考其中代码

java 如何把一个目录下的所有.java文件复制到另一个目录下,并保持其结构不变

通过历遍当前文件夹下所有文件和文件夹信息,然后(处理文件夹自己去处理):
File fold = new File( "c:\\test.properties ");
String strNewPath = "c:\\testok\\ ";
File fnewpath = new File(strNewPath);
if(!fnewpath.exists())
fnewpath.mkdirs();
File fnew = new File(strNewPath+fold.getName());
fold.renameTo(fnew);
参考技术A 运用递归可以实现 参考技术B 运用递归的原理 参考技术C 百度上搜索就可以有答案

以上是关于delphi如何删除目录和目录下的所有文件的主要内容,如果未能解决你的问题,请参考以下文章

delphi删除整个目录及目录下的文件

DELPHI中在对目录、文件中的问题

在删除给定目录节点下的所有文件和文件夹的程序的上下文中,“try-with-resources”实际上是如何工作的

cmd删除文件夹下的所有东西

DELPHI如何获取某目录下的所有文件名?

dos 下如何删除某个目录下的创建时间为5天前的文件夹?用批处理文件