![](/img/trans.png)
[英]How to delete all content from remote folder before uploading files through SMB with TeamCity
[英]Delphi, delete folder with content
当我在文件夹中有子文件夹时 - 此代码不会删除文件夹...有任何错误吗?
procedure TForm.Remove(Dir: String);
var
Result: TSearchRec; Found: Boolean;
begin
Found := False;
if FindFirst(Dir + '\*', faAnyFile, Result) = 0 then
while not Found do begin
if (Result.Attr and faDirectory = faDirectory) AND (Result.Name <> '.') AND (Result.Name <> '..') then Remove(Dir + '\' + Result.Name)
else if (Result.Attr and faAnyFile <> faDirectory) then DeleteFile(Dir + '\' + Result.Name);
Found := FindNext(Result) <> 0;
end;
FindClose(Result); RemoveDir(Dir);
end;
最简单的方法是调用TDirectory.Delete(Dir, True)
。
TDirectory
可以在IOUtils
中找到,这是最近的RTL添加。
True
标志被传递给Recursive
参数,这意味着在删除目录之前会清空目录的内容,这是删除目录的重要部分。
在评论中,您告诉我们您使用Delphi 7,因此无法使用。
你的代码看起来很好。 但是,你不是说:
(Result.Attr and faAnyFile <> faDirectory)
我想你的意思是:
(Result.Attr and faDirectory <> faDirectory)
我可能会写如下:
procedure TMyForm.Remove(const Dir: string);
var
Result: TSearchRec;
begin
if FindFirst(Dir + '\*', faAnyFile, Result) = 0 then
begin
Try
repeat
if (Result.Attr and faDirectory) = faDirectory then
begin
if (Result.Name <> '.') and (Result.Name <> '..') then
Remove(Dir + '\' + Result.Name)
end
else if not DeleteFile(Dir + '\' + Result.Name) then
RaiseLastOSError;
until FindNext(Result) <> 0;
Finally
FindClose(Result);
End;
end;
if not RemoveDir(Dir) then
RaiseLastOSError;
end;
如果我是你,我只是告诉操作系统删除包含其所有内容的文件夹。 通过编写这样做( uses ShellAPI
)
var
ShOp: TSHFileOpStruct;
begin
ShOp.Wnd := Self.Handle;
ShOp.wFunc := FO_DELETE;
ShOp.pFrom := PChar('C:\Users\Andreas Rejbrand\Desktop\Test\'#0);
ShOp.pTo := nil;
ShOp.fFlags := FOF_NO_UI;
SHFileOperation(ShOp);
[如果你这样做
ShOp.fFlags := 0;
相反,你得到一个很好的确认对话框。 如果你这样做
ShOp.fFlags := FOF_NOCONFIRMATION;
你没有得到确认对话框,但如果操作很长,你会得到一个进度条。 最后,如果添加FOF_ALLOWUNDO
标志,则将目录移动到Waste Bin而不是永久删除它。
ShOp.fFlags := FOF_ALLOWUNDO;
当然,您可以根据需要组合标志:
ShOp.fFlags := FOF_NOCONFIRMATION or FOF_ALLOWUNDO;
将不会显示任何确认(但由于您未指定FOF_NO_UI
而显示进度对话框),该目录将被移动到垃圾箱而不会被永久删除。
我最后一次需要删除包含内容的文件夹我使用了JCL :
uses JclFileUtils;
DeleteDirectory(DirToDelete, True);
最后一个参数告诉文件是否应该转到回收站,这是一个很好的奖励。
要解决原始问题 - 试试这个:
procedure TForm.Remove(const Dir: String);
var
sDir: String;
Rec: TSearchRec;
begin
sDir := IncludeTrailingPathDelimiter(Dir);
if FindFirst(sDir + '*.*', faAnyFile, Rec) = 0 then
try
repeat
if (Rec.Attr and faDirectory) = faDirectory then
begin
if (Rec.Name <> '.') and (Rec.Name <> '..') then
Remove(sDir + Rec.Name);
end else
begin
DeleteFile(sDir + Rec.Name);
end;
until FindNext(Rec) <> 0;
finally
FindClose(Rec);
end;
RemoveDir(sDir);
end;
uses DSiWin32;
DSiDeleteTree(folderName, false);
DSiWin32是一个开源项目,与“按需使用”许可证相关。
2022: System.IOUtils.TDirectory.Delete :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.