Delphi实时确定文件大小

时间:2011-07-01 13:03:02

标签: delphi filesize

Delphi是否可以在复制时确定文件的大小?我首先将文件复制到文件夹时收到通知,但需要等到副本完成才能处理文件。

我使用了JclFileUtils.GetSizeOfFile(Filename)但是这给了我'预期的'文件大小,而不是当前的文件大小。

问候,彼得

3 个答案:

答案 0 :(得分:1)

第一个答案提示我决定放弃尝试确定文件副本何时完成。相反,我发现使用TFileStream给了我一个可靠的指示文件是否正在使用。

function IsFileInUse(Filename: string; var ResultMessage: string): boolean;
var
  Stream: TFileStream;
begin
  Result := True;
  ResultMessage := '';
  try
    Stream := TFileStream.Create(Filename, fmOpenRead or fmShareDenyWrite);
    try
      Result := False;
    finally
      FreeAndNil(Stream);
    end;

  Except on E: Exception do
    ResultMessage := 'IsFileInUse: ' + E.Message
  end;
end;

通过这种方式,我可以继续检查,直到文件不再使用,然后再尝试处理它。

答案 1 :(得分:0)

这取决于复制功能使用的技术。大多数复制方法将在开始复制文件之前先分配磁盘空间。因此,如果要复制4 GB的文件,系统首先创建一个包含4 GB随机数据的文件。 (这是闪电般快速的,顺便说一句。)然后它复制数据本身,但文件大小已经是你所期望的。 这样做的好处是,系统可以检查是否有足够的磁盘空间可用于实际复制数据。

如果您编写自己的文件复制功能,那么您可以完全控制它的执行方式。否则,您只能使用所选择的复制方法。那么,你如何复制文件?

答案 2 :(得分:0)

如果您可以控制文件复制过程,则最简单的方法是让复制例程使用临时文件名创建文件,完成后,将其重命名为正确的文件名。 这样,您可以使用Windows文件夹监视来监视重命名(JCL包含一个组件来帮助解决此问题,不确定此处的名称)。当您的代码被触发时,您确定另一方已完成文件的编写。 我使用的一个简单技巧是让复制过程创建一个扩展名为“$$$”的新文件。我的代码仍然被触发,但我忽略了它们,直到它们被重命名为正确的文件名。

希望这有帮助。