# # Backup / restore tool for last modified and created time of files # Copyright 2008 www.reviewmylife.co.uk # # NirCmd can be got from http://www.nirsoft.net/utils/nircmd.html # use strict; use File::Find; my $directory = $ARGV[0]; if (not -d $directory) { error("! $directory does not exist\n"); } my $backupfile = "backuplist.txt"; my $backupfilepath = "$directory\\$backupfile"; my $nircmdExe = "F:\\utils\\nircmd.exe"; my %backupData = (); my $flag = $ARGV[1]; if ($flag =~ /-backup/i) { open (CONFIG, "<$backupfilepath"); while () { chomp; my ($filePath, $nircmdCreateTime, $nircmdModTime, $createTime, $modTime) = split(',', $_); $backupData{lc($filePath)} = "$nircmdCreateTime,$nircmdModTime,$createTime,$modTime"; } find(\&backupLastModified, $directory); open BACKUPLIST, ">$backupfilepath" or die "! Can't open backup file $backupfilepath"; foreach my $file (sort keys %backupData) { print BACKUPLIST "$file,$backupData{$file}\n"; } } elsif ($flag =~ /-restore/i) { open BACKUPLIST, "<$backupfilepath" or die "! Can't open backup file $backupfilepath"; restoreLastModified(); } else { error("! Unrecognised flag: $flag"); } close BACKUPLIST; sub backupLastModified() { if (-d $File::Find::name) { return; } if ($File::Find::name =~ /$backupfile$/i) { return; } my $file = $File::Find::name; $file =~ s/\//\\/g; $file = lc($file); if ($backupData{$file}) { return; } if (not open(FILE, "<$file")) { print "! Can't open $file for backup - $!\n"; return; } my $modTime = (stat FILE)[9]; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($modTime); my $nircmdModTime = sprintf "%02d-%02d-%4d %02d:%02d:%02d", $mday,$mon+1,$year+1900,$hour,$min,$sec; my $createTime = (stat FILE)[10]; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($createTime); my $nircmdCreateTime = sprintf "%02d-%02d-%4d %02d:%02d:%02d", $mday,$mon+1,$year+1900,$hour,$min,$sec; $backupData{$file} = "$nircmdCreateTime,$nircmdModTime,$createTime,$modTime"; print "$file,$nircmdCreateTime,$nircmdModTime,$createTime,$modTime\n"; close FILE; } sub restoreLastModified() { while () { chomp; my ($filePath, $nircmdCreateTime, $nircmdModTime, $createTime, $modTime) = split(',', $_); if (not -e $filePath) { print "WARNING: $filePath does not exist\n"; next; } open (FILE, "<$filePath") or die "! Can't open $filePath for restore"; my $fileModTime = (stat FILE)[9]; my $fileCreateTime = (stat FILE)[10]; close FILE; if ($createTime == $fileCreateTime && $modTime == $fileModTime) { next; } print("$nircmdExe setfiletime \"$filePath\" \"$nircmdCreateTime\" \"$nircmdModTime\"\n"); system("$nircmdExe setfiletime \"$filePath\" \"$nircmdCreateTime\" \"$nircmdModTime\""); } } sub error() { print "Usage: backupLastModified [directory] [-backup/-restore]\n"; die $_[0]; }