Delphi 是否可以在复制文件时确定文件的大小?当文件首次复制到文件夹时,我会收到通知,但需要等到复制完成才能处理该文件。
我使用过
JclFileUtils.GetSizeOfFile(Filename)
但这给了我“预期”文件大小,而不是当前文件大小。
在第一个答案的提示下,我决定放弃尝试确定文件复制何时完成。相反,我发现使用
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;
通过这种方式,我可以继续检查,直到文件不再使用,然后再尝试处理它。
这取决于复制功能所使用的技术。大多数复制方法会在开始复制文件之前先分配磁盘空间。因此,如果要复制 4 GB 的文件,系统首先会创建一个总共 4 GB 的随机数据文件。 (顺便说一句,速度快如闪电。)然后它会复制数据本身,但文件大小已经是您所期望的了。 这样做的优点是系统人员可以检查是否有足够的磁盘空间可用于实际复制数据。
如果您编写自己的文件复制功能,那么您可以完全控制它如何执行此操作。否则,您将受限于所选复制方法为您提供的任何内容。那么,如何复制文件呢?
如果您可以控制文件复制过程,最简单的方法是让复制例程使用临时文件名创建文件,完成后将其重命名为正确的文件名。 这样,您可以使用 Windows 文件夹监视来监视重命名(JCL 包含一个组件来帮助完成此操作,不确定此处的名称)。当您的代码被触发时,您确定另一方已完成写入文件。 我使用的一个简单技巧是让复制过程创建带有“$$$”扩展名的新文件。我的代码仍然被触发,但我忽略了它们,直到它们被重命名为正确的文件名。
希望这有帮助。