-1

我正在使用 Windows API 递归删除许多文件和文件夹。我在没有 UI 的情况下使用它并抑制错误。问题是,如果其中一个文件正在使用中,它会完全失败。我期待这种可能性,并希望这种情况继续下去,跳过任何此类情况。失败的一个文件实际上是调用此删除命令的同一个 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;

我怎样才能让它跳过正在使用的文件的任何事件?我查看了文档,但找不到任何可以做到这一点的东西。

4

2 回答 2

0

Why don't you try this:

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;

It's another way to do it.

于 2014-05-13T11:39:47.540 回答
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;

也许它可以帮助你。

于 2014-05-12T14:19:01.730 回答