Thread overview
getting filesystem type or accurate file write time
Jun 13, 2006
simon.hodson
Jun 13, 2006
Derek Parnell
Jun 13, 2006
Regan Heath
June 13, 2006
Anyone know an easy way of getting the last write time of a file into a UTC time regardless of the source filesystem?

I need to equate update times on source files and have found that these times can be different under Windows when the source files are stored on different filesystems. NTFS uses UTC with no TimeZone) and FAT uses UTC with a TimeZone. The resolution also appears to be different too, but I'll worry about that later.

Looks as though I need to find out the filesystem the source file is on then make the correct translation to UTC.

Anyone got any ideas?

Simon
June 13, 2006
On Wed, 14 Jun 2006 01:57:39 +1000, <simon.hodson@hssnet.com> wrote:

> Anyone know an easy way of getting the last write time of a file into a UTC time
> regardless of the source filesystem?

I have some routines that I use in Build. Download the source and look at util/fdt.d

I can post it here but its about 300 lines of code.

-- 
Derek Parnell
Melbourne, Australia
June 13, 2006
On Tue, 13 Jun 2006 15:57:39 +0000 (UTC), <simon.hodson@hssnet.com> wrote:
> Anyone know an easy way of getting the last write time of a file into a UTC time
> regardless of the source filesystem?
>
> I need to equate update times on source files and have found that these times
> can be different under Windows when the source files are stored on different
> filesystems. NTFS uses UTC with no TimeZone) and FAT uses UTC with a TimeZone.
> The resolution also appears to be different too, but I'll worry about that
> later.
>
> Looks as though I need to find out the filesystem the source file is on then
> make the correct translation to UTC.
>
> Anyone got any ideas?

In C, you would use the "stat" function, combined with "gmtime". You can use both in D too:

import std.stream;
import std.stdio;
import std.c.time;

extern (C) {
	struct _stat {
		int st_dev;
		ushort st_ino;
		ushort st_mode;
		short st_nlink;
		short st_uid;
		short st_gid;
//		uint st_rdev;
		int st_size;
		int st_atime;
		int st_mtime;
		int st_ctime;
	}
	int stat(char *path, _stat *buffer);
}

void main()
{
	_stat buf;
	tm *tm;	
	File f;	
	
	f = new File("test36.txt",FileMode.Out);
	f.writeLine("Line 1");
	f.writeLine("Line 2");
	f.close();

	if (stat("test36.txt",&buf) == -1) writefln("FAIL");
	else {
		writefln("st_dev: ",buf.st_dev);
		writefln("st_ino: ",buf.st_ino);
		writefln("st_mode: ",buf.st_mode);
		writefln("st_nlink: ",buf.st_nlink);
		writefln("st_uid: ",buf.st_uid);
		writefln("st_gid: ",buf.st_gid);
		writefln("st_size: ",buf.st_size);
		writefln("st_atime: ",buf.st_atime);
		writefln("st_mtime: ",buf.st_mtime);
		writefln("st_ctime: ",buf.st_ctime);
	}
	
	writefln("");
	
	tm = localtime(&buf.st_atime);
	if (tm) writefln("Access Time(LCL): ",asctime(tm)[0..24]);
	
	tm = gmtime(&buf.st_atime);
	if (tm) writefln("Access Time(GMT): ",asctime(tm)[0..24]);
	
	tm = localtime(&buf.st_mtime);
	if (tm) writefln("Modification Time(LCL): ",asctime(tm)[0..24]);
	
	tm = gmtime(&buf.st_mtime);
	if (tm) writefln("Modification Time(GMT): ",asctime(tm)[0..24]);
	
	tm = localtime(&buf.st_ctime);
	if (tm) writefln("Creation Time(LCL): ",asctime(tm)[0..24]);
	
	tm = gmtime(&buf.st_ctime);
	if (tm) writefln("Creation Time(GMT): ",asctime(tm)[0..24]);
}

Regan