Windows to Linux Porting - timeCreated and timeLastAccessed

Vino vino.bheeman at hotmail.com
Fri May 4 15:30:26 UTC 2018


On Friday, 4 May 2018 at 15:16:23 UTC, wjoe wrote:
> On Friday, 4 May 2018 at 14:24:36 UTC, Vino wrote:
>> On Friday, 4 May 2018 at 14:02:24 UTC, Jonathan M Davis wrote:
>>> On Friday, May 04, 2018 13:17:36 Vino via Digitalmars-d-learn 
>>> wrote:
>>>> [...]
>>>
>>> Linux does not keep track of the creation time of a file. So, 
>>> it will not work to have a program on Linux ask a file how 
>>> long it's been since the file was created. If you want that 
>>> information, you'll have to store it elsewhere somehow (and 
>>> that generally only works if you created the file in the 
>>> first place).
>>>
>>> The modification time of the file is the time that the file 
>>> was last changed (which would be the creation time if it were 
>>> only ever written to once, but in the general case, it has no 
>>> relation to the creation time at all). So, you could use 
>>> std.file.timeLastModified to find out if a file has been 
>>> changed within the last x number of days, but there is no way 
>>> to find out the creation time of a file by asking the 
>>> filesystem.
>>>
>>> - Jonathan M Davis
>>
>> Hi Jonathan,
>>
>>   Thank you,  i got your point from the other forum topic 
>> which was raised by me earlier, hence decided to use 
>> modification time, the request is on how and the best approach 
>> to port the code from windows to Linux eg program below
>>
>> Example Code:
>> import std.stdio: writeln;
>> import std.container.array;
>> import std.file: dirEntries,isFile, SpanMode;
>> import std.algorithm: filter, map;
>> import std.typecons: Tuple, tuple;
>> import std.datetime.systime: SysTime;
>>
>>
>> version (Windows) { alias sTimeStamp = timeCreated; } else 
>> version (linux) { alias sTimeStamp = timeLastAccessed; }
>>
>> auto clogClean (string LogDir ) {
>> Array!(Tuple!(string, SysTime)) dFiles;
>>  dFiles.insert(dirEntries(LogDir, SpanMode.shallow).filter!(a 
>> => a.isFile).map!(a => tuple(a.name, a.sTimeStamp)));
>>  return dFiles;
>> }
>>
>> void main () {
>> string LogDir;
>> LogDir = "//DScript/Test";       //  Error: undefined 
>> identifier timeLastAccessed on Linux
>> LogDir = "C:\\DScript\\Others";  //  Error: undefined 
>> identifier timeCreated on Windows.
>> writeln(clogClean(LogDir));
>> }
>>
>> From,
>> Vino.B
>
> Unlike NTFS for Windows there's a plethora of different file 
> systems available to use for Linux, one of which doesn't even 
> support deletion of files. You also have to keep in mind that 
> even if the same file system is used, there is no guarantee 
> that you have the same set of metadata available for a mount 
> point each and every time.
> Consider a file system that's mounted with the 'noatime' 
> option, for instance, which doesn't log access times.
>
> As far as I understand you are globing files, check times and 
> then act upon that.
> If I were to port this to Linux, or any other OS for that 
> matter, I wouldn't depend on a feature of an OS.
> Instead, since you have to look at a file either way to get the 
> meta data (which you query with the stat family of functions), 
> I would build my own database or cache with that information.
> Glob the directory and add files not yet present with the 
> current date (and any other meta data you might need).
> Then query all the files of interest and do whatever you want 
> to do with them and remove the entry.
>
> Downside is you have possibly another dependency. On the plus 
> side you could easily query all files older than X days or 
> whatever with a single select and batch process them.

Hi Wjoe,

   Thank you very much, but what i am expecting is something like 
OS switch, based of OS type switch the funciton eg:

If OS is windows use the funciton timeCreated else if the OS is 
linux use the function timeLastAccessed in the below example 
program, something similar as stated in the link

https://dlang.org/spec/declaration.html#alias

Eg1:
version (Win32)
{
     alias myfoo = win32.foo;
}
version (linux)
{
     alias myfoo = linux.bar;
}



auto clogClean (string LogDir ) {
Array!(Tuple!(string, SysTime)) dFiles;


version (Windows) {  alias sTimeStamp = 
std.file.DirEntry.timeCreated;} else version (linux) { alias 
sTimeStamp = std.file.DirEntry.timeLastAccessed; }


dFiles.insert(dirEntries(LogDir, SpanMode.shallow).filter!(a => 
a.isFile).map!(a => tuple(a.name, a.sTimeStamp)));
  return dFiles;
}

From,
Vino.B


More information about the Digitalmars-d-learn mailing list