@@ -190,25 +190,29 @@ public void SetData(byte[] data, int index, int count)
190190 // bit 2 if set, creation time is present
191191
192192 _flags = ( Flags ) helperStream . ReadByte ( ) ;
193- if ( ( ( _flags & Flags . ModificationTime ) != 0 ) && ( count >= 5 ) ) {
193+ if ( ( ( _flags & Flags . ModificationTime ) != 0 ) )
194+ {
194195 int iTime = helperStream . ReadLEInt ( ) ;
195196
196- _modificationTime = ( new DateTime ( 1970 , 1 , 1 , 0 , 0 , 0 ) . ToUniversalTime ( ) +
197- new TimeSpan ( 0 , 0 , 0 , iTime , 0 ) ) . ToLocalTime ( ) ;
197+ _modificationTime = new DateTime ( 1970 , 1 , 1 , 0 , 0 , 0 , 0 , DateTimeKind . Utc ) +
198+ new TimeSpan ( 0 , 0 , 0 , iTime , 0 ) ;
199+
200+ // Central-header version is truncated after modification time
201+ if ( count <= 5 ) return ;
198202 }
199203
200204 if ( ( _flags & Flags . AccessTime ) != 0 ) {
201205 int iTime = helperStream . ReadLEInt ( ) ;
202206
203- _lastAccessTime = ( new DateTime ( 1970 , 1 , 1 , 0 , 0 , 0 ) . ToUniversalTime ( ) +
204- new TimeSpan ( 0 , 0 , 0 , iTime , 0 ) ) . ToLocalTime ( ) ;
207+ _lastAccessTime = new DateTime ( 1970 , 1 , 1 , 0 , 0 , 0 , 0 , DateTimeKind . Utc ) +
208+ new TimeSpan ( 0 , 0 , 0 , iTime , 0 ) ;
205209 }
206210
207211 if ( ( _flags & Flags . CreateTime ) != 0 ) {
208212 int iTime = helperStream . ReadLEInt ( ) ;
209213
210- _createTime = ( new DateTime ( 1970 , 1 , 1 , 0 , 0 , 0 ) . ToUniversalTime ( ) +
211- new TimeSpan ( 0 , 0 , 0 , iTime , 0 ) ) . ToLocalTime ( ) ;
214+ _createTime = new DateTime ( 1970 , 1 , 1 , 0 , 0 , 0 , 0 , DateTimeKind . Utc ) +
215+ new TimeSpan ( 0 , 0 , 0 , iTime , 0 ) ;
212216 }
213217 }
214218 }
@@ -224,17 +228,17 @@ public byte[] GetData()
224228 helperStream . IsStreamOwner = false ;
225229 helperStream . WriteByte ( ( byte ) _flags ) ; // Flags
226230 if ( ( _flags & Flags . ModificationTime ) != 0 ) {
227- TimeSpan span = _modificationTime . ToUniversalTime ( ) - new DateTime ( 1970 , 1 , 1 , 0 , 0 , 0 ) . ToUniversalTime ( ) ;
231+ TimeSpan span = _modificationTime - new DateTime ( 1970 , 1 , 1 , 0 , 0 , 0 , 0 , DateTimeKind . Utc ) ;
228232 var seconds = ( int ) span . TotalSeconds ;
229233 helperStream . WriteLEInt ( seconds ) ;
230234 }
231235 if ( ( _flags & Flags . AccessTime ) != 0 ) {
232- TimeSpan span = _lastAccessTime . ToUniversalTime ( ) - new DateTime ( 1970 , 1 , 1 , 0 , 0 , 0 ) . ToUniversalTime ( ) ;
236+ TimeSpan span = _lastAccessTime - new DateTime ( 1970 , 1 , 1 , 0 , 0 , 0 , 0 , DateTimeKind . Utc ) ;
233237 var seconds = ( int ) span . TotalSeconds ;
234238 helperStream . WriteLEInt ( seconds ) ;
235239 }
236240 if ( ( _flags & Flags . CreateTime ) != 0 ) {
237- TimeSpan span = _createTime . ToUniversalTime ( ) - new DateTime ( 1970 , 1 , 1 , 0 , 0 , 0 ) . ToUniversalTime ( ) ;
241+ TimeSpan span = _createTime - new DateTime ( 1970 , 1 , 1 , 0 , 0 , 0 , 0 , DateTimeKind . Utc ) ;
238242 var seconds = ( int ) span . TotalSeconds ;
239243 helperStream . WriteLEInt ( seconds ) ;
240244 }
@@ -321,7 +325,7 @@ public DateTime CreateTime
321325 /// <summary>
322326 /// Get/set the <see cref="Flags">values</see> to include.
323327 /// </summary>
324- Flags Include
328+ public Flags Include
325329 {
326330 get { return _flags ; }
327331 set { _flags = value ; }
@@ -365,13 +369,13 @@ public void SetData(byte[] data, int index, int count)
365369 if ( ntfsTag == 1 ) {
366370 if ( ntfsLength >= 24 ) {
367371 long lastModificationTicks = helperStream . ReadLELong ( ) ;
368- _lastModificationTime = DateTime . FromFileTime ( lastModificationTicks ) ;
372+ _lastModificationTime = DateTime . FromFileTimeUtc ( lastModificationTicks ) ;
369373
370374 long lastAccessTicks = helperStream . ReadLELong ( ) ;
371- _lastAccessTime = DateTime . FromFileTime ( lastAccessTicks ) ;
375+ _lastAccessTime = DateTime . FromFileTimeUtc ( lastAccessTicks ) ;
372376
373377 long createTimeTicks = helperStream . ReadLELong ( ) ;
374- _createTime = DateTime . FromFileTime ( createTimeTicks ) ;
378+ _createTime = DateTime . FromFileTimeUtc ( createTimeTicks ) ;
375379 }
376380 break ;
377381 } else {
@@ -394,9 +398,9 @@ public byte[] GetData()
394398 helperStream . WriteLEInt ( 0 ) ; // Reserved
395399 helperStream . WriteLEShort ( 1 ) ; // Tag
396400 helperStream . WriteLEShort ( 24 ) ; // Length = 3 x 8.
397- helperStream . WriteLELong ( _lastModificationTime . ToFileTime ( ) ) ;
398- helperStream . WriteLELong ( _lastAccessTime . ToFileTime ( ) ) ;
399- helperStream . WriteLELong ( _createTime . ToFileTime ( ) ) ;
401+ helperStream . WriteLELong ( _lastModificationTime . ToFileTimeUtc ( ) ) ;
402+ helperStream . WriteLELong ( _lastAccessTime . ToFileTimeUtc ( ) ) ;
403+ helperStream . WriteLELong ( _createTime . ToFileTimeUtc ( ) ) ;
400404 return ms . ToArray ( ) ;
401405 }
402406 }
@@ -469,9 +473,9 @@ public DateTime LastAccessTime
469473 }
470474
471475 #region Instance Fields
472- DateTime _lastAccessTime = DateTime . FromFileTime ( 0 ) ;
473- DateTime _lastModificationTime = DateTime . FromFileTime ( 0 ) ;
474- DateTime _createTime = DateTime . FromFileTime ( 0 ) ;
476+ DateTime _lastAccessTime = DateTime . FromFileTimeUtc ( 0 ) ;
477+ DateTime _lastModificationTime = DateTime . FromFileTimeUtc ( 0 ) ;
478+ DateTime _createTime = DateTime . FromFileTimeUtc ( 0 ) ;
475479 #endregion
476480 }
477481
@@ -575,33 +579,18 @@ public Stream GetStreamForTag(int tag)
575579 /// <summary>
576580 /// Get the <see cref="ITaggedData">tagged data</see> for a tag.
577581 /// </summary>
578- /// <param name="tag ">The tag to search for.</param >
582+ /// <typeparam name="T ">The tag to search for.</typeparam >
579583 /// <returns>Returns a <see cref="ITaggedData">tagged value</see> or null if none found.</returns>
580- private ITaggedData GetData ( short tag )
584+ public T GetData < T > ( )
585+ where T : class , ITaggedData , new ( )
581586 {
582- ITaggedData result = null ;
583- if ( Find ( tag ) ) {
584- result = Create ( tag , _data , _readValueStart , _readValueLength ) ;
585- }
586- return result ;
587- }
588-
589- static ITaggedData Create ( short tag , byte [ ] data , int offset , int count )
590- {
591- ITaggedData result = null ;
592- switch ( tag ) {
593- case 0x000A :
594- result = new NTTaggedData ( ) ;
595- break ;
596- case 0x5455 :
597- result = new ExtendedUnixData ( ) ;
598- break ;
599- default :
600- result = new RawTaggedData ( tag ) ;
601- break ;
587+ T result = new T ( ) ;
588+ if ( Find ( result . TagID ) )
589+ {
590+ result . SetData ( _data , _readValueStart , _readValueLength ) ;
591+ return result ;
602592 }
603- result . SetData ( data , offset , count ) ;
604- return result ;
593+ else return null ;
605594 }
606595
607596 /// <summary>
0 commit comments