File Coverage

blib/lib/Win32/FileTime.pm
Criterion Covered Total %
statement 4 6 66.6
branch n/a
condition n/a
subroutine 2 2 100.0
pod n/a
total 6 8 75.0


line stmt bran cond sub pod time code
1             package Win32::FileTime;
2              
3 2     2   119517 use Carp;
  2         5  
  2         147  
4 2     2   900 use Win32::API;
  0            
  0            
5             use Win32API::File qw/ :ALL /;
6              
7             use strict;
8             use vars qw/ $VERSION /;
9              
10             $VERSION = '0.04';
11              
12              
13             sub Access {
14             my ( $self, @args ) = @_;
15             return $self->getTime( $self->{'ACCESS'}, @args );
16             }
17              
18              
19             sub Create {
20             my ( $self, @args ) = @_;
21             return $self->getTime( $self->{'CREATE'}, @args );
22             }
23              
24              
25             sub Modify {
26             my ( $self, @args ) = @_;
27             return $self->getTime( $self->{'MODIFY'}, @args );
28             }
29              
30              
31             sub getTime {
32             my ( $self, $FileTimePointer, @args ) = @_;
33              
34             my $LocalTime = pack( 'LL', 0, 0 );
35             my $FileTimeToLocalFileTime = Win32::API->new(
36             'kernel32',
37             'FileTimeToLocalFileTime',
38             [ 'P', 'P' ],
39             'I'
40             );
41             $FileTimeToLocalFileTime->Call( $FileTimePointer, $LocalTime );
42              
43             my $SystemTime = pack( 'SSSSSSSS', 0, 0, 0, 0, 0, 0, 0, 0 );
44              
45             my $FileTimeToSystemTime = Win32::API->new(
46             'kernel32',
47             'FileTimeToSystemTime',
48             [ 'P', 'P' ],
49             'I'
50             );
51             $FileTimeToSystemTime->Call( $LocalTime, $SystemTime );
52              
53             my @time = unpack( 'SSSSSSSS', $SystemTime );
54              
55             my %filetime = (
56             'year' => $time[0],
57             'month' => $time[1],
58             'wday' => $time[2],
59             'day' => $time[3],
60             'hour' => $time[4],
61             'minute' => $time[5],
62             'second' => $time[6],
63             'msecond' => $time[7]
64             );
65              
66             return @time unless scalar @args;
67              
68             my @return;
69             foreach (@args) {
70             defined $filetime{$_} or croak( __PACKAGE__, '->getTime : Unknown time field argument passed to object method' );
71             push @return, $filetime{$_};
72             }
73             return @return;
74             }
75              
76              
77             sub new {
78             my ( $class, $filename ) = @_;
79              
80             my $self = {};
81             $self->{'FILENAME'} = $filename;
82             $self->{'HFILE'} = CreateFile(
83             $self->{'FILENAME'},
84             GENERIC_READ(),
85             FILE_SHARE_READ(),
86             [],
87             OPEN_EXISTING(),
88             0,
89             []
90             ) or croak( __PACKAGE__, '->new : Cannot read file - ', $self->{'FILENAME'} );
91              
92             my %filetime = (
93             'create' => undef,
94             'access' => undef,
95             'modify' => undef
96             );
97             $filetime{$_} = pack( "LL", 0, 0 ) for keys %filetime;
98              
99             my $GetFileTime = Win32::API->new(
100             'kernel32',
101             'GetFileTime',
102             [ 'N', 'P', 'P', 'P' ],
103             'I'
104             );
105             $GetFileTime->Call(
106             $self->{'HFILE'},
107             $filetime{'create'},
108             $filetime{'access'},
109             $filetime{'modify'}
110             );
111             $self->{ uc $_ } = $filetime{ $_ } for keys %filetime;
112              
113             CloseHandle( $self->{'HFILE'} );
114              
115             bless $self, $class;
116             return $self;
117             }
118              
119              
120             1;
121              
122              
123             __END__