Home > database >  Why is FileAge returning unexpected values?
Why is FileAge returning unexpected values?

Time:10-13

So i have a 'downloads' folder where i put everything i download in my day by day work. You know we always automate everything, so I'm trying to build a simply app to run everyday to delete files older than 30 days, as i have to do this manually from time to time to avoid the folder become too big.

Here is my code :

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;

Problem is "d" variable is returning very big numbers like 1397401677, even if the file has only 1 day.

The only detail here is i run Windows in a Parallels virtual machine and the "\psf\home\downloads" folder is on Mac, but i can access this folderl normally using Windows Explorer, so for Delphi is like a regular local folder.

What am i missing ?

CodePudding user response:

Did you read the documentation for FileAge? The first day in programming school, you are taught "When you start using a new function or API, you begin by reading its documentation." In this case, the function's documentation says

The [one-argument] overloaded version of FileAge is deprecated.

So you are using a function you shouldn't be using.

Still, this function should probably still work.

But what do you expect it to return? Well, obviously the thing that the docs say it should return:

The first overload returns an integer that represents the OS time stamp of the file. The result can be later converted to a TDateTime using the FileDateToDateTime function.

But when you use this in DaysBetween, you assume it already is a TDateTime!

Why is FileAge returning unexpected values?

It isn't. It is probably returning exactly the thing its documentation says it should return.

CodePudding user response:

You are using the older version of FileAge() that returns a timestamp in DOS numeric format, but you are treating it as a TDateTime, which it is not. As the FileAge documentation says:

The first overload returns an integer that represents the OS time stamp of the file. The result can be later converted to a TDateTime using the FileDateToDateTime() function.

So, do what the documentation says to do, eg:

var
  age: Integer;

age := FileAge(f);
if age <> -1 then
  d := DaysBetween(FileDateToDateTime(age), Now)

Otherwise, use the newer version of FileAge() that outputs a TDateTime to begin with, eg:

var
  dt: TDateTime;

if FileAge(f, dt) then
  d := DaysBetween(dt, Now)
  • Related