Delphi 删除文件不工作

Delphi 删除文件不工作,delphi,delphi-7,Delphi,Delphi 7,似乎在我代码的某个地方,我正在处理的文件以某种方式保留了它,因为我似乎无法删除它。我的复制文件例程似乎可以正常工作,但复制完成后,我似乎无法删除它 FSize:= GetFileSizeExt(InPath + InFileName); if FSize <= 0 then begin //archive file if AfterAction = 'MOVE' then begin tmpExt:= ExtractFileExt(I

似乎在我代码的某个地方,我正在处理的文件以某种方式保留了它,因为我似乎无法删除它。我的复制文件例程似乎可以正常工作,但复制完成后,我似乎无法删除它

   FSize:=  GetFileSizeExt(InPath + InFileName);
   if FSize <= 0 then
   begin
    //archive file
    if  AfterAction = 'MOVE' then
    begin
     tmpExt:= ExtractFileExt(InFileName);
     if CopyFile(PChar(InPath + InFileName), PChar(MovePath + '\' + ChangeFileExt(InFileName,'') + '_' + FormatDateTime('mmddyyyy-hhmmss', Now) + tmpExt), True) then
     begin
      if not DeleteFile(pchar(InPath + InFileName)) then
      begin
       ExitCode:= 8;
       raise ECustomException.Create('Invalid After Action. Error Deleting File!');
      end;
     end //if CopyFile
     else //if not DeleteFile
     begin
      ExitCode:= 16;
      raise ECustomException.Create('File Copy Error!');
     end; //else
    end; //if  AfterAction = 'MOVE' then
     ExitCode:= 17;
     raise ECustomException.Create('Error Getting file size OR file size less than or equal to zero!');
   end; //if filesize =0
FSize:=GetFileSizeExt(InPath+InFileName);

如果FSize如果您不知道删除文件失败的原因,为什么不让操作系统告诉您呢?替换此代码:

raise ECustomException.Create('Invalid After Action. Error Deleting File!');

我认为问题与您正在显示的代码无关,因此这里列出了要检查的事项:

  • 该文件不是只读的
  • 文件不在只读介质上
  • 运行应用程序的用户有权删除该文件
  • 该文件未被使用

还有一件事我会做:当出现无法删除文件的异常时,在IDE中点击RUN之前,我会转到Windows资源管理器并尝试自己删除文件。

为什么不使用MoveFile()或MoveFileEx()函数,而不是先复制后删除?

它执行相同的工作,但Windows API MoveFile()函数无法在驱动器之间重命名/移动文件。

可能是因为在复制过程之前执行了代码,所以要复制的文件仍然处于打开状态。(即,在您未发布的代码中)DeleteFile正在工作。其要求之一是不删除不允许删除的文件。它正在成功。找出阻止删除文件的原因。如果另一个进程锁定了它,那么process Explorer会告诉您。我用其中的数据测试了该文件,代码运行良好。如果我从文件中删除数据,使文件大小为0,则它不起作用。我有个例外。所以,它与文件大小有关。为什么不调用MoveFile呢?它提供了CopyFile所没有的某些优势(例如,链接跟踪、安全描述符维护、速度)。+1到“文件未被使用”我要加上:“并且不要忘记,杀毒软件可能会使用该文件来检查病毒,特别是如果您只是复制/移动它…”我用其中的数据测试了该文件,代码运行良好。如果我从文件中删除数据,使文件大小为0,则它不起作用。我有个例外。因此,它与filesize有关。RAISELASERROR给我一个错误代码32:进程无法访问该文件,因为它正被另一个进程使用。同样,我刚才用一个包含数据的文件替换了零字节文件,它工作得很好。如果我使用记事本编辑此文件并删除数据使其为0字节,则会出现此错误。是的,我两次都关闭了文本编辑器。在只做一件事的控制台应用程序中进行测试:删除硬编码文件。你会看到它适用于0大小的文件。我的错!我确实按错误的顺序排列了代码,文件是在上面发布的代码生效时打开的。这些文件不仅会跨驱动器移动,还会跨机器移动(UNC路径)