delphi - 为什么 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 来说就像一个普通的本地文件夹。
我错过了什么?
解决方案
您是否阅读了文档FileAge
?在编程学校的第一天,你被教导“当你开始使用一个新的函数或 API 时,你首先要阅读它的文档。” 在这种情况下,函数的文档说
的 [one-argument] 重载版本
FileAge
已弃用。
所以你正在使用一个你不应该使用的功能。
不过,这个功能应该仍然可以工作。
但是你期望它返回什么?好吧,显然文档说它应该返回的东西:
第一个重载返回一个整数,表示文件的操作系统时间戳。稍后可以
TDateTime
使用该FileDateToDateTime
函数将结果转换为 a。
但是当你在 中使用它时DaysBetween
,你假设它已经是TDateTime
!
为什么 FileAge 返回意外的值?
它不是。它可能正在返回其文档所说的应该返回的东西。
推荐阅读
- c# - EF LINQ 使用多个值跨多个字段进行搜索,但它们都必须至少出现一次
- excel - VBA 执行一分钟,然后看似无缘无故地循环回到 with 语句
- python - Scrapy,爬取多页的动态页面
- spring-webflux - 如何使用带有 zip 可迭代的组合器
- haxe - 带有 Windows (cpp) 目标的 Haxe 列表文件返回空字符串?
- clojure - 在哪里放置 Clojure 规范?
- webpack - Laravel Mix webpack 别名 - PhpStorm
- wildfly - 如何配置 Wildfly 连接到远程 Artemis 服务器?
- json - 使用 ironPython 在 Spotfire DataTable 中显示 JSON 数组结果
- sqlite - 使用 jest 和 sqlite 进行测试被阻止