2011-06-13 18 views
11

MSDN documentationFileInfo.Name संपत्ति के लिए MSDN documentation से, मैं देखता हूं कि संपत्ति के लिए डेटा पहली बार कैश किया जाता है और इसे बाद में Refresh विधि का उपयोग करके अपडेट किया जाएगा।सी #

मैं निम्नलिखित प्रश्नों जो मैं नहीं मिल या दस्तावेज में भी स्पष्ट नहीं हैं कर सकते हैं कर दिया है:

  1. एक ही समय में कैश की गई सभी गुण के लिए डेटा है?

  2. Refresh विधि FileInfo के निर्माण पर या केवल तभी जब किसी संपत्ति को पहली बार बुलाया जाता है?

  3. यदि मैंने एक संपत्ति कहा है, उदा। Name संपत्ति, और इसे Refresh कहा जाता है, एक अलग संपत्ति को कॉल करेगा, उदा। DirectoryName संपत्ति, पहली बार इसे Refresh पर कॉल करने का कारण बनती है, या इसे केवल पूरे वर्ग में उपयोग की जाने वाली पहली संपत्ति द्वारा बुलाया जाता है (प्रश्न # 1 देखें)?

  4. क्या मैं Refresh पर मैन्युअल रूप से कॉल करके सभी गुणों को पूर्व-कैश कर सकता हूं? (मान लीजिए कि यह ऑब्जेक्ट के निर्माण पर प्री-कैश नहीं है)

  5. Refresh पर कॉल करने से मैन्युअल रूप से pre-cached गुण होते हैं, उदा। CreationTime, रीफ्रेश होने के लिए भी?

+2

मुझे लगता है कि आप डाउनलोड करने का सुझाव देते हैं ILSpy http://wiki.sharpdevelop.net/ILSpy.ashx और FileInfo के कार्यान्वयन की जांच करें। बीसीएल प्रकार के आंतरिक पर इस तरह के विस्तृत प्रश्नों के उत्तर पाने का यह सबसे अच्छा तरीका है। – bentayloruk

+0

मैं सहमत हूं। यह ध्यान देने योग्य भी है कि अब (ठीक है, आज के रूप में) आप ऑनलाइन संदर्भ स्रोत ब्राउज़ कर सकते हैं। यहां [FileInfo परिभाषा] है (http://referencesource.microsoft.com/#mscorlib/system/io/fileinfo.cs,4ee673c1a4ecad41) इसकी सभी महिमा में। –

उत्तर

4
  1. एक अनुमान पर, हाँ। यह FileInfo के लिए पहले से प्राप्त किए गए गुणों को प्राप्त करने के लिए स्वयं को पराजित करने "ऑप्टिमाइज़ेशन" की तरह लगता है, विशेष रूप से जब वे one API call में प्राप्त किए जा सकते हैं (और संभवतः)।

  2. तथ्य यह है कि प्रलेखन (मेरे लिए वैसे भी) DirectoryInfo तरीकों जो सेवा काफी दृढ़ता से पता चलता है पहले से ही-कैश FileInfo रों बाहर कॉल कि बस एक FileInfo निर्माण कुछ भी कैश नहीं है। यह समझ में आता है - यदि आप सीधे FileInfo बनाते हैं, तो यह उस फ़ाइल को संदर्भित कर सकता है जो अभी तक मौजूद नहीं है (उदाहरण के लिए, आप इसे बनाने की योजना बना रहे हैं), जबकि कैश किए गए सभी विधियां FileInfo एस उन फ़ाइलों को संदर्भित करती हैं जो मौजूद हैं स्नैपशॉट का समय, धारणा के तहत आप कम से कम कुछ का उपयोग करने जा रहे हैं।

  3. नहीं, प्रश्न के उत्तर के अनुसार 1. यही कारण है कि ताज़ा विधि वहां है।

  4. मुझे कल्पना होगी (उत्तर 1 देखें)।

  5. हां। उत्तर 3 देखें।

2

CreationTime संपत्ति के मूल्य पूर्व-संचित करता है, तो FileSystemInfo वस्तु की वर्तमान उदाहरण निम्नलिखित DirectoryInfo से किसी भी विधि से लौटाए गए है:

  • GetDirectories
  • GetFiles
  • GetFileSystemInfos
  • एन्युमेरेट डायरेक्टरीज
  • EnumerateFiles
  • EnumerateFileSystemInfos

नवीनतम मूल्य प्राप्त करने के लिए, ताज़ा विधि कॉल।

तो फ़ाइल FileSystemInfo वस्तु में वर्णित मौजूद नहीं है, इस संपत्ति 12:00 आधी रात वापस आ जाएगी, 1 जनवरी, 1601 ईस्वी (सी.ई.) समन्वित यूनिवर्सल समय (UTC), स्थानीय समय के लिए समायोजित।

एनटीएफएस-स्वरूपित ड्राइव फ़ाइल मेटा-जानकारी कैश कर सकते हैं, जैसे फाइल निर्माण समय, थोड़े समय के लिए। इस प्रक्रिया को फ़ाइल सुरंग के रूप में जाना जाता है। नतीजतन, यदि आप मौजूदा फ़ाइल को अधिलेखित या प्रतिस्थापित कर रहे हैं, तो फ़ाइल के निर्माण समय को स्पष्ट रूप से सेट करना आवश्यक हो सकता है।

(MSDN)

आंतरिक रूप से, Refresh मानक Win32API कॉल करता है और इस प्रकार सभी गुण भरता है।

[...] 
flag2 = Win32Native.GetFileAttributesEx(path, 0, ref data); 

किसी भी संपत्ति है कि ताज़ा करने के लिए निर्दिष्ट किया जाता है को एक्सेस करना उदाहरण के लिए, एक पूर्ण ताज़ा कारण बनता है:

public DateTime LastAccessTimeUtc 
{ 
    [SecuritySafeCritical] 
    get 
    { 
     if (this._dataInitialised == -1) 
     { 
      this._data = default(Win32Native.WIN32_FILE_ATTRIBUTE_DATA); 
      this.Refresh(); 
     } 
     [...]