2011-03-17 18 views
14

मैं फ़ाइल ताला लगा के बिनाफ़ाइल। रीडलाइन इसे लॉक किए बिना?

new FileStream(logfileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

के साथ एक FileStream खोल सकते हैं।

मैं File.ReadLines(string path) साथ भी ऐसा ही कर सकते हैं?

+5

[प्रलेखन] (http://msdn.microsoft.com/en-us/library/dd383503.aspx) ReadLines का ताला व्यवहार के बारे में कुछ नहीं कहा। इस प्रकार, भले ही इसे यह पता लगाना चाहिए कि आपके द्वारा उपयोग किए जाने वाले .NET फ्रेमवर्क के कार्यान्वयन से फ़ाइल लॉक नहीं होती है, यह ऐसा कुछ नहीं है जिसे आप अपने एप्लिकेशन को विकसित करते समय भरोसा कर सकते हैं। – Heinzi

उत्तर

31

नहीं ... एक FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 0x1000, FileOptions.SequentialScan);

केवल पढ़ने के लिए तो शेयर खोलता आप परावर्तक के साथ देखें, तो आप अंत File.ReadLines में है कि देखेंगे।

(यह तकनीकी रूप से FileStream के साथ एक StreamReader जैसा कि ऊपर वर्णित खुलता है)

मैं जोड़ देंगे कि यह यह करने के लिए एक स्थिर विधि बनाने के लिए बच्चों का खेल हो रहा है:

public static IEnumerable<string> ReadLines(string path) 
{ 
    using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 0x1000, FileOptions.SequentialScan)) 
    using (var sr = new StreamReader(fs, Encoding.UTF8)) 
    { 
     string line; 
     while ((line = sr.ReadLine()) != null) 
     { 
      yield return line; 
     } 
    } 
} 

यह रिटर्न एक IEnumerable<string> (फ़ाइल में कई हज़ार लाइनें हैं और आपको केवल एक बार में उन्हें पार्स करने की आवश्यकता है) कुछ बेहतर है। यदि आपको किसी सरणी की आवश्यकता है, तो इसे LINQ का उपयोग करके ReadLines("myfile").ToArray() के रूप में कॉल करें।

कृपया ध्यान रखें कि, तर्कसंगत रूप से, यदि फ़ाइल "पीछे की ओर (विधि के पीछे)" बदलती है, तो सब कुछ कैसे काम करेगा, यह निश्चित रूप से परिभाषित नहीं है (यह शायद तकनीकी रूप से परिभाषित है, लेकिन परिभाषा शायद काफी लंबी और जटिल है)

+0

जहाँ तक ReSharper एक रूपरेखा उपकरण है, परावर्तक इस तरह के मामले – abatishchev

+0

@abatishchev में इस्तेमाल किया जाना चाहिए: मैं एक रूपरेखा उपकरण के रूप में ReSharper का वर्णन नहीं होगा। मेरा मानना ​​है कि यह अब भी विघटन कर सकता है (संभवतः केवल बीटा रिलीज में)। –

+1

यदि आप व्यवहार 'रीडलाइन' से मेल खाते हैं और 'ReadAllLines' नहीं हैं तो आप अपनी विधि' ReadAllLines' क्यों कहते हैं? – CodesInChaos

2

File.ReadLines() जब तक यह खत्म फ़ाइल लॉक हो जाएगा।

+1

उत्तर समाधान का प्रतिनिधित्व करना चाहिए या कम से कम उस दिशा की तरफ इशारा करना चाहिए। उत्तर साधक पहले से ही आपके द्वारा लगाए गए तथ्य को जानता है, इसलिए यह कुछ भी उपयोगी नहीं करता है। –

संबंधित मुद्दे