Có thể có một tệp có ngày sửa đổi trước ngày được tạo không? Những hành động sẽ gây ra sự kiện này xảy ra?
Có thể có một tệp có ngày sửa đổi trước ngày được tạo không? Những hành động sẽ gây ra sự kiện này xảy ra?
Câu trả lời:
Hãy xem xét một kho lưu trữ .tar được trích xuất. Thông thường, các tệp được trích xuất sẽ có dấu thời gian sửa đổi lần cuối được chỉ định từ nội dung lưu trữ (thường là trong quá khứ trừ khi bạn là người du hành thời gian). Theo như hệ thống tập tin, những tập tin này vừa được tạo.
Ngoài ra còn có các tiện ích để thay đổi thời gian sửa đổi của các tệp hiện có, trên Linux, ví dụ đây là lệnh cảm ứng .
cp -p
và điều đó bắt chước nó như rcp -p
và scp -p
, cũng như rsync
với -t
hoặc -a
, lấy modtime từ nguồn.
Nếu bạn tạo một tệp từ đầu, nó sẽ có thời gian tạo là "ngay bây giờ" và ngày sửa đổi là "ngay bây giờ". Bây giờ hãy tưởng tượng sao chép tập tin này vào ổ đĩa khác. Windows sẽ giữ thời gian sửa đổi, nhưng thời gian tạo tệp đó sẽ được đặt thành thời gian bạn sao chép tệp vào ổ đĩa đó (tức là thời gian tệp được tạo trên ổ đĩa đó ). Đơn giản như thế.
Nó thực sự đúng:
Trên Windows, rất dễ cài đặt (giả mạo, nếu bạn muốn) một lần tạo và sửa đổi tệp. Bạn không phải thay đổi đồng hồ của máy tính; bạn thậm chí không cần truy cập quản trị viên địa phương. Tất cả bạn cần là viết quyền truy cập vào tập tin trong câu hỏi.
Để đặt thời gian tạo tệp với PowerShell bằng cách sử dụng SetCreationTime
:
[System.IO.File]::SetCreationTime("C:\path\to\file.ext", (Get-Date "8/8/2088"))
Để đặt thời gian sửa đổi lần cuối bằng cách sử dụng SetLastWriteTime
:
[System.IO.File]::SetLastWriteTime("C:\path\to\file.ext", (Get-Date "7/4/1776"))
Trên Linux, bạn có thể dễ dàng thay đổi thời gian sửa đổi lần cuối của tệp bằng -d
cờ của touch
, như thể hiện trong câu trả lời Hỏi Ubuntu này . Thực sự không có khái niệm về ngày tạo cho các tệp trên hệ thống tệp Linux ( đọc thêm tại Unix & Linux ).
Điều quan trọng nhất cần lưu ý ở đây là thời gian sửa đổi tệp không thực sự đặc biệt - nó được lưu trữ giống như bất kỳ dữ liệu nào khác. Không có cách nào để biết khi nào dữ liệu thực sự được ghi vào lần cuối hoặc đọc từ đó.
Từ đây, chúng ta có thể thấy rằng luôn luôn có thể (không bao gồm phương tiện ghi một lần như CD) và trực tiếp sửa đổi các bit trên ổ đĩa lưu trữ thời gian sửa đổi lần cuối hoặc thậm chí là thời gian tạo.
Thực tế hơn, điều này cũng có thể thực hiện được từ bên trong các hệ điều hành phổ biến, như các câu trả lời khác đã lưu ý. Trong Windows, SetFileTime
chức năng này được cung cấp bởi chức năng WinAPI và bạn có thể thực hiện việc này với utime
Linux. Các công cụ như touch
xây dựng trên đầu các API này.
Việc sử dụng hợp pháp phổ biến nhất cho các API này là trong việc duy trì thời gian sửa đổi, ví dụ như khi sao chép tệp, trích xuất chúng từ kho lưu trữ, v.v.
Theo kinh nghiệm của tôi, đó là khi một hoặc nhiều máy tính đã được sử dụng để sửa đổi tệp và một trong số chúng có thời gian hệ thống sai. Ba nguyên nhân phổ biến nhất khiến thời gian hệ thống bị sai, không theo thứ tự cụ thể là: