diff --git a/lib/zip/entry.rb b/lib/zip/entry.rb index 2fa8bac..40a370a 100755 --- a/lib/zip/entry.rb +++ b/lib/zip/entry.rb @@ -74,6 +74,8 @@ module Zip def time if @extra['UniversalTime'] @extra['UniversalTime'].mtime + elsif @extra['NTFS'] + @extra['NTFS'].mtime else # Standard time field in central directory has local time # under archive creator. Then, we can't get timezone. @@ -84,10 +86,10 @@ module Zip alias :mtime :time def time=(value) - unless @extra.member?('UniversalTime') + unless @extra.member?('UniversalTime') || @extra.member?('NTFS') @extra.create('UniversalTime') end - @extra['UniversalTime'].mtime = value + (@extra['UniversalTime'] || @extra['NTFS']).mtime = value @time = value end diff --git a/lib/zip/extra_field.rb b/lib/zip/extra_field.rb index f7a7172..d8b5050 100755 --- a/lib/zip/extra_field.rb +++ b/lib/zip/extra_field.rb @@ -94,6 +94,7 @@ require 'zip/extra_field/old_unix' require 'zip/extra_field/unix' require 'zip/extra_field/zip64' require 'zip/extra_field/zip64_placeholder' +require 'zip/extra_field/ntfs' # Copyright (C) 2002, 2003 Thomas Sondergaard # rubyzip is free software; you can redistribute it and/or diff --git a/lib/zip/extra_field/ntfs.rb b/lib/zip/extra_field/ntfs.rb new file mode 100644 index 0000000..9feabd4 --- /dev/null +++ b/lib/zip/extra_field/ntfs.rb @@ -0,0 +1,92 @@ +module Zip + # PKWARE NTFS Extra Field (0x000a) + # Only Tag 0x0001 is supported + class ExtraField::NTFS < ExtraField::Generic + HEADER_ID = [0x000A].pack('v') + register_map + + WINDOWS_TICK = 10000000.0 + SEC_TO_UNIX_EPOCH = 11644473600 + + def initialize(binstr = nil) + @ctime = nil + @mtime = nil + @atime = nil + binstr and merge(binstr) + end + + attr_accessor :atime, :ctime, :mtime + + def merge(binstr) + return if binstr.empty? + size, content = initial_parse(binstr) + (size && content) or return + + content = content[4..-1] + tags = parse_tags(content) + + tag1 = tags[1] + if tag1 + ntfs_mtime, ntfs_atime, ntfs_ctime = tag1.unpack("Q