Vui lòng đọc câu hỏi này đầy đủ và cẩn thận trước khi trả lời. Câu trả lời không đơn giản như nó có thể xuất hiện.Làm cách nào để nhận được đúng ngày giờ sửa đổi của tệp FAT32, bất kể múi giờ trong .NET?
Tôi đang viết chương trình cần theo dõi thời gian sửa đổi của các tệp, một số được lưu trữ trên ổ đĩa FAT32 bên ngoài. Chương trình đang được chạy trên các máy Windows 7 khác nhau.
Sự cố là thay đổi ngày giờ thay đổi UTC khi thay đổi bù trừ UTC hiện tại. Cụ thể, khi chúng ta đi từ Giờ chuẩn New Zealand (UTC + 12) đến Giờ ban ngày New Zealand (UTC + 13) và ngược lại. Đó không phải lỗi đánh máy - UTC thay đổi ngày giờ được sửa đổi. Nó không nên, đó là loại điểm của UTC, nhưng nó. Điều này dường như là một hạn chế của hệ thống tệp FAT32 - các tệp trên NTFS hoạt động tốt.
Console.WriteLine(DateTime.Now.ToString() + (DateTime.Now.IsDaylightSavingTime() ? " Daylight" : " Standard"));
Console.WriteLine(new FileInfo(args[0]).LastWriteTimeUtc.ToString("yyyyMMdd HH mmss"));
Múi giờ hệ thống là New Zealand và ngày hệ thống là ngày 9 tháng 4 năm 2012 là Giờ chuẩn New Zealand.
C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test1\Test.txt
2012-04-09 3:53:46 pm Standard
20120409 03 5316
Bây giờ, hãy đặt ngày hệ thống thành ngày 1 tháng 3 năm 2012 là Giờ ban ngày New Zealand. Lưu ý rằng tôi đã đổi tên thư mục chứa tệp thử nghiệm. Điều này quan trọng bởi vì nếu không Windows sẽ lưu vào bộ nhớ cache sửa đổi của tệp. Tôi lãng phí rất nhiều thời gian trước khi tôi tìm ra điều đó.
C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test2\Test.txt
2012-03-01 3:54:13 pm Daylight
20120409 02 5316
Bây giờ, hãy đặt ngày hệ thống trở lại ngày 9 tháng 4 năm 2012 và thay đổi múi giờ thành Adelaide (UTC + 09: 30).
C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test3\Test.txt
2012-04-09 1:27:21 pm Standard
20120409 06 2316
Vậy làm cách nào để có được đúng giờ được sửa đổi? Tôi có thể thử và tìm hiểu xem tập tin có nằm trên hệ thống tệp FAT32 hay không và nếu đó là thời gian tiết kiệm ánh sáng ban ngày thì hãy điều chỉnh một giờ, nhưng ngay cả khi tôi có thể làm điều đó để hoạt động thì đó là một bản hack xấu xí khủng khiếp. Sẽ sử dụng một công việc gọi hệ thống cấp thấp (tôi nghi ngờ không phải vì vấn đề có vẻ là ở cấp hệ điều hành)? Tôi có thể thay đổi múi giờ của quy trình mà không thay đổi múi giờ trên toàn bộ máy không? Còn cách nào khác không?
Một giải pháp có thể có cho vấn đề này có thể là không sử dụng LastWriteTimeUtc của một tệp nhưng sự khác biệt của LastWriteTimeUtc của hai tệp. Nếu sự khác biệt của "c: \ a.txt" và "c: \ b.txt" khác với sự khác biệt của "\\ backup \ a.txt" và "\\ backup \ b.txt", LastWriteTimeUtc tại ít nhất một tệp khác nhau. – user1027167
Có vẻ như những gì bạn thực sự muốn biết là nếu tệp khác với lần cuối cùng bạn nhìn thấy nó. Nếu chúng không lớn, bạn có thể băm chúng. Ngoài ra, dấu thời gian không thực sự là giải pháp phù hợp dù sao, vì có điều kiện chủng tộc ở đó nếu bạn đọc tệp và nó được cập nhật trong cùng một lượng tử thời gian. – rsaxvc