2012-04-09 26 views
9

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?

+0

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

+0

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

Trả lời

8

Sự cố là, FAT32 filesystem stores file time as a local time. Do đó, thời gian UTC là thời gian tính toán tính đến DST, dẫn đến thời gian UTC khác nhau. Nói chung vấn đề này rất phức tạp, nó không thể giải quyết được.

Ví dụ bạn sẽ cần lưu trữ thời gian sửa đổi tệp UTC thực trong một tệp riêng biệt, tệp phải được đồng bộ hóa trên mỗi máy trước khi ổ đĩa ngoài bị xóa. Nếu đồng bộ hóa sẽ không được định dạng trước ít nhất một lần, thì nó không thể được coi là chính xác. Và không có cách nào đơn giản để thực thi điều đó với người dùng.

+6

OMG hút rất nhiều (FAT32). Cảm ơn bạn về thông tin. – TallGuy

+2

@TallGuy: Hệ thống FAT32 lưu trữ các mục nhập thư mục ở định dạng cơ bản không thay đổi kể từ ngày của * IBM * PC gốc.Do hầu hết các máy vi tính của thời đại không có bất kỳ loại đồng hồ chính xác nào, và thậm chí PC không có bất kỳ cách nào để duy trì ngày và thời gian khi tắt nguồn, chức năng liên quan đến múi giờ sẽ không là gì ngoài việc gây phiền toái hầu hết người dùng. – supercat

Các vấn đề liên quan