2012-09-19 30 views
5

Windows có cung cấp bất cứ thứ gì như trường st_ctime của POSIX stat, cung cấp dấu thời gian của thay đổi siêu dữ liệu cuối cùng không?Windows và ctime/st_ctime

Thông tin cơ bản: Tôi có một số tệp dữ liệu mà tôi muốn kiểm tra xem chúng đã được sửa đổi từ một dấu thời gian cụ thể hay chưa. Việc kiểm tra dấu thời gian (mtime) đã sửa đổi rất dễ dàng và cần phải sửa đổi "bình thường", nhưng nếu người dùng sao chép qua các phiên bản cũ hơn của tệp dữ liệu, thì dấu thời gian đã sửa đổi sẽ cho thấy chúng cũ hơn. Trên hệ thống POSIX, việc sao chép qua một tệp cũ hơn sẽ dẫn đến ctime là mới hơn, ngay cả khi mtime cũ hơn.

Trả lời

2

Theo như tôi có thể biết, Windows không cung cấp trường "đã thay đổi lần cuối", nhưng tôi chưa tìm thấy bất kỳ API Win32 nào để truy cập, vì vậy bạn phải sử dụng API gốc.

Cụ thể là: (Tôi đã không thực sự cố gắng này.)

  • Gọi NtOpenFile để có được một tay cầm.
  • Gọi NtQueryInformationFile với thông số FileInformationClass của FileNetworkOpenInformation để nhận cấu trúc FILE_NETWORK_OPEN_INFORMATION.
  • Thành viên CreationTime của cấu trúc FILE_NETWORK_OPEN_INFORMATION tương đương với thời gian POSIX.

Sử dụng API gốc không chính xác đơn giản. This question and answer mô tả cách thực hiện.

Cygwin tận dụng điều này để cung cấp ngữ nghĩa POSIX trong Windows, như được thảo luận on their mailing list. Tôi nhận được thông tin của tôi từ their implementation.

Và mặc dù nó chỉ liên quan tiếp tuyến, this article có mô tả tốt về dấu thời gian "được tạo" mà Windows hiện diện (và không may được gọi là thời gian). Dấu thời gian được tạo có thể mới hơn dấu thời gian được sửa đổi nếu tệp được sao chép sang vị trí mới (kể từ khi tạo ra rồi đề cập đến khi bản sao được tạo, trong khi sửa đổi đề cập đến thời điểm bản gốc được sửa đổi lần cuối), nhưng nó không được cập nhật khi siêu dữ liệu được thay đổi.

+1

Cảm ơn, vâng, đó là những gì @piscisaureus đã kết thúc làm trong libuv. ctime bây giờ được thực hiện với ngữ nghĩa Unix (aka, "chính xác") trong libuv: https://github.com/joyent/libuv/commit/20a8e58adb2a3fc2e92ceb6e1ceb6f05d7e0d439 Mặc dù câu trả lời này đến sau khi chúng ta đã tìm thấy nó, được tặng thưởng bởi vì bạn đã giúp những người tìm kiếm trong tương lai tìm thấy câu trả lời đúng :) – isaacs