递归删除文件并跳过正在使用的文件?

时间:2014-05-12 13:36:05

标签: delphi winapi shfileoperation

我使用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,但找不到任何可以做到的事情。

2 个答案:

答案 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;

这是另一种方法。