首页 > 解决方案 > 为什么 FileAge 返回意外的值?

问题描述

所以我有一个“下载”文件夹,我将下载的所有内容放在我的日常工作中。你知道我们总是自动化一切,所以我正在尝试构建一个简单的应用程序来每天运行以删除超过 30 天的文件,因为我必须不时手动执行此操作以避免文件夹变得太大。

这是我的代码:

function TForm1.deleteOldDownloads: boolean;
var
  f: string;
  i, d: Integer;
var
  sl: tstringlist;
begin
try
  FileListBox1.Directory := '\\psf\home\downloads';
  FileListBox1.refresh;
  sl := tstringlist.create;
  for i := 0 to FileListBox1.items.count - 1 do
    begin
    f := FileListBox1.Directory + '\' + FileListBox1.items[i];
    if fileexists(f) then
      d := daysbetween(FileAge(f), now)
    else
      d := 0;
    if d > 30 then // problem is here, d is always a big number, not the actually age of file
      sl.Add(f);
    end;
  if sl.count > 0 then
    begin
    for i := 0 to sl.count do
      begin
      f := sl[i];
      deletefile(f);
      end;
    end;
  sl.Free;
except
  on e: Exception do
    begin     
    end;
end;

问题是“d”变量返回非常大的数字,例如 1397401677,即使文件只有 1 天。

这里唯一的细节是我在 Parallels 虚拟机中运行 Windows,并且“\psf\home\downloads”文件夹在 Mac 上,但我可以使用 Windows 资源管理器正常访问这个文件夹,所以对于 Delphi 来说就像一个普通的本地文件夹。

我错过了什么?

标签: delphidelphi-10.4-sydney

解决方案


您是否阅读了文档FileAge?在编程学校的第一天,你被教导“当你开始使用一个新的函数或 API 时,你首先要阅读它的文档。” 在这种情况下,函数的文档说

的 [one-argument] 重载版本FileAge已弃用。

所以你正在使用一个你不应该使用的功能。

不过,这个功能应该仍然可以工作。

但是你期望它返回什么?好吧,显然文档说它应该返回的东西:

第一个重载返回一个整数,表示文件的操作系统时间戳。稍后可以TDateTime使用该FileDateToDateTime函数将结果转换为 a。

但是当你在 中使用它时DaysBetween,你假设它已经是TDateTime!

为什么 FileAge 返回意外的值?

它不是。它可能正在返回其文档所说的应该返回的东西。


推荐阅读