我使用Windows API以递归方式删除许多文件和文件夹。我在没有用户界面的情况下使用它并抑制错误。问题是,如果其中一个文件正在使用中,则完全失败。我希望有这种可能性,并且希望这种情况无论如何都要继续下去,不要再这样了。失败的一个文件实际上是调用此删除命令的EXE(在完成所有操作之后将被删除。
这就是我现在正在做的事情:
procedure DeleteDirectory(const DirName: string);
var
FileOp: TSHFileOpStruct;
begin
FillChar(FileOp, SizeOf(FileOp), 0);
FileOp.wFunc := FO_DELETE;
FileOp.pFrom := PChar(DirName+#0);//double zero-terminated
FileOp.fFlags := FOF_SILENT or FOF_NOERRORUI or FOF_NOCONFIRMATION;
SHFileOperation(FileOp);
end;
如何跳过正在使用的文件的任何事件?我看了the documentation,但找不到任何可以做到的事情。
答案 0 :(得分:0)
以下是您可以在函数中实现的一个想法,以验证是否有任何正在使用的文件:
function IsFileInUse(FileName: TFileName): Boolean;
var
HFileRes: HFILE;
begin
Result := False;
if not FileExists(FileName) then
Exit;
HFileRes := CreateFile(PChar(FileName),
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
Result := (HFileRes = INVALID_HANDLE_VALUE);
if not Result then
CloseHandle(HFileRes);
end;
也许它可以帮到你。
答案 1 :(得分:0)
为什么不试试这个:
procedure DeleteFiles(const DirName: String);
var
SR: TSearchRec;
i: Integer;
begin
//get all files in directory
i := FindFirst(DirName +'\*.*', faAnyFile, SR);
while i = 0 do
begin
if (SR.Attr and faDirectory) <> faDirectory then
DeleteFile(DirName +'\'+ SR.Name);
i := FindNext(SR);
end;
FindClose(SR);
end;
这是另一种方法。