Delphi是否可以在复制时确定文件的大小?我首先将文件复制到文件夹时收到通知,但需要等到副本完成才能处理文件。
我使用了JclFileUtils.GetSizeOfFile(Filename)
但是这给了我'预期的'文件大小,而不是当前的文件大小。
问候,彼得
答案 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包含一个组件来帮助解决此问题,不确定此处的名称)。当您的代码被触发时,您确定另一方已完成文件的编写。 我使用的一个简单技巧是让复制过程创建一个扩展名为“$$$”的新文件。我的代码仍然被触发,但我忽略了它们,直到它们被重命名为正确的文件名。
希望这有帮助。