उत्तर देने से पहले कृपया पूरी तरह से और ध्यान से पढ़ें। जवाब उतना आसान नहीं है जितना दिख सकता है।.NET में टाइमज़ोन की परवाह किए बिना, मुझे FAT32 फ़ाइल का सही संशोधित डेटाटाइम कैसे प्राप्त हो सकता है?
मैं एक प्रोग्राम लिख रहा हूं जिसे संशोधित डेटाटाइम फ़ाइलों का ट्रैक रखने की आवश्यकता है, जिनमें से कुछ बाहरी FAT32 ड्राइव पर संग्रहीत हैं। कार्यक्रम विभिन्न विंडोज 7 मशीनों पर चलाया जा रहा है।
समस्या यूटीसी संशोधित डेटाटाइम परिवर्तन है जब वर्तमान यूटीसी ऑफ़सेट बदलता है। विशेष रूप से, जब हम न्यूजीलैंड मानक समय (यूटीसी +12) से न्यूज़ीलैंड डेलाइट टाइम (यूटीसी + 13) में जाते हैं और फिर वापस आते हैं। यह एक टाइपो नहीं है - यूटीसी संशोधित डेटाटाइम परिवर्तन। यह नहीं होना चाहिए, यह यूटीसी का मुद्दा है, लेकिन यह करता है। यह FAT32 फ़ाइल सिस्टम की एक सीमा प्रतीत होता है - NTFS पर फ़ाइलें ठीक काम करती हैं।
Console.WriteLine(DateTime.Now.ToString() + (DateTime.Now.IsDaylightSavingTime() ? " Daylight" : " Standard"));
Console.WriteLine(new FileInfo(args[0]).LastWriteTimeUtc.ToString("yyyyMMdd HH mmss"));
सिस्टम टाइमज़ोन न्यूजीलैंड है और सिस्टम की तारीख 9 अप्रैल 2012 है जो न्यूज़ीलैंड मानक समय है।
C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test1\Test.txt
2012-04-09 3:53:46 pm Standard
20120409 03 5316
अब सिस्टम तिथि 1 मार्च 2012 को सेट करें जो न्यूज़ीलैंड डेलाइट टाइम है। ध्यान दें कि मैंने उस निर्देशिका का नाम बदल दिया है जिसमें परीक्षण फ़ाइल है। यह महत्वपूर्ण है क्योंकि अन्यथा विंडोज़ फ़ाइल के संशोधित डेटाटाइम को कैश करेगा। इससे पहले कि मैंने इसे समझ लिया, मैंने बहुत समय बर्बाद कर दिया।
C:\Dev\UtcModifiedDatetime\bin\Debug>UtcModifiedDatetime.exe M:\Test2\Test.txt
2012-03-01 3:54:13 pm Daylight
20120409 02 5316
अब प्रणाली की तारीख वापस 9 अप्रैल 2012 के सेट और एडिलेड (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
तो मैं सही संशोधित डेटाटाइम कैसे प्राप्त कर सकता हूं? मैं कोशिश कर सकता हूं और यह पता लगा सकता हूं कि फ़ाइल एक FAT32 फ़ाइल सिस्टम पर है और यदि डेलाइट सेविंग टाइम एक घंटे का समायोजन करता है, लेकिन अगर मैं इसे काम करने के लिए भी प्राप्त कर सकता हूं तो यह एक भयानक बदसूरत हैक होगा। निम्न स्तर के सिस्टम कॉल काम का उपयोग करेंगे (मुझे संदेह नहीं है क्योंकि समस्या ओएस स्तर पर प्रतीत होती है)? क्या मैं पूरी मशीन पर इसे बदलने के बिना प्रक्रिया का टाइमज़ोन बदल सकता हूं? क्या कोई और तरीका है?
इस समस्या के लिए एक संभावित समाधान एक फ़ाइल के LastWriteTimeUtc का उपयोग नहीं करना चाहिए, लेकिन दो फ़ाइलों के LastWriteTimeUtc का अंतर नहीं हो सकता है। यदि "c: \ a.txt" और "c: \ b.txt" का अंतर "\\ बैकअप \ a.txt" और "\\ बैकअप \ b.txt" के अंतर से अलग है, तो LastWriteTimeUtc पर कम से कम एक फ़ाइल अलग है। – user1027167
ऐसा लगता है कि आप वास्तव में जानना चाहते हैं कि फ़ाइल आखिरी बार से अलग है या नहीं। अगर वे बड़े नहीं हैं, तो आप उन्हें हर्ष कर सकते हैं। इसके अतिरिक्त, टाइमस्टैम्प वास्तव में सही समाधान नहीं हैं, क्योंकि यदि आप फ़ाइल पढ़ते हैं तो दौड़-परिस्थितियां होती हैं और यह एक ही समय क्वांट के दौरान अपडेट की जाती है। – rsaxvc