2010-12-06 9 views
8

मेरे अनुप्रयोगों में से एक का उपयोग उन फ़ाइलों को पढ़ने (और केवल पढ़ने के लिए) है जो उपयोग में हो सकते हैं।वर्तमान में उपयोग की जाने वाली फ़ाइल को कैसे पढ़ा जाए, जैसे विंडोज़ इसे कॉपी करते समय करता है?

लेकिन, जब एक फ़ाइल जो पहले से ही में खोला जाता है, उदाहरण के लिए, पढ़ना, माइक्रोसॉफ्ट वर्ड, इस आवेदन फेंकता एक System.IO.IOException:

प्रक्रिया फ़ाइल '< फ़ाइल नाम यहाँ >' उपयोग नहीं कर सकते क्योंकि यह किया जा रहा है एक और प्रक्रिया द्वारा प्रयोग किया जाता है।

फ़ाइल को पढ़ने के लिए इस्तेमाल किया कोड है:

using (Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete)) 
{ 
    // Do stuff here. 
} 
बेशक

, क्योंकि फ़ाइल पहले से ही प्रयोग किया जाता है, इस अपवाद की उम्मीद है।

अब, अगर मैं एक नए स्थान पर फ़ाइल की प्रतिलिपि करने ऑपरेटिंग सिस्टम से पूछते हैं, तो इसे पढ़ने के लिए, यह काम करता है:

string tempFileName = Path.GetTempFileName(); 
File.Copy(fileName, tempFileName, true); 
//           ↓ We read the newly created file. 
using (Stream stream = new FileStream(tempFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete)) 
{ 
    // Do stuff here. 
} 

क्या File.Copy का जादू जो पहले से ही इस्तेमाल किया फ़ाइल को पढ़ने के लिए अनुमति देता है एक आवेदन द्वारा, और विशेष रूप से अस्थायी प्रतिलिपि के बिना फ़ाइल पढ़ने के लिए इस जादू का उपयोग कैसे करें?

+0

आपका कोड मेरे लिए ठीक काम करता है। क्या यह संभव है कि आप अपने ऐप में FileAccess.Write निर्दिष्ट कर रहे हों, भले ही यह आपके स्निपेट में नहीं है? –

+0

सीरान कीटिंग के अनुसार आपके मूल कोड के ऊपर मेरे लिए काम करता है। "// यहां सामान करो" में आप क्या कर रहे हैं। –

उत्तर

4

अच्छा सवाल है। इस पर एक नज़र डालें, ऐसा लगता है कि फाइलशेयर का उपयोग करने का सुझाव है। रीडवाइट केवल कुंजी है, यह एक शॉट के लायक है।

http://www.geekzilla.co.uk/viewD21B312F-242A-4038-9E9B-AE6AAB53DAE0.htm

+0

टिप्पणियां पढ़ना, ऐसा लगता है कि यह कुछ परिस्थितियों में काम करता है, और दूसरों में नहीं है। मेरे मामले में, माइक्रोसॉफ्ट वर्ड द्वारा पहले से खोली गई फाइल के साथ, 'FileShare.ReadWrite' पर स्विच करने से समस्या हल नहीं होती है। –

+0

यह कष्टप्रद है, यह ब्लॉगपोस्ट भी वही चीज़ सुझाता है। http://alexpinsker.blogspot.com/2005/03/how-to-read-file-thats-in-use-by.html यह इसके साथ एक समस्या प्रतीत होता है * पहले से ही * पढ़ा जा रहा है, जैसा कि बाद के विपरीत है पढ़ता है (आपका ऐप)। – Tom

+0

एक और sidenote के रूप में, फ़ाइल का उपयोग कर। ओपन एक फ़ाइलस्ट्रीम देता है, जैसा कि यहां सुझाया गया है: http://aautar.digital-radiation.com/blog/?p=1292 – Tom

0

फ़ाइलस्ट्रीम कन्स्ट्रक्टर से FileShare.ReadWrite | FileShare.Delete को हटाने का प्रयास करें, या कम से कम FileShare.Delete।

+6

ये झंडे निर्दिष्ट करते हैं कि * अन्य * फ़ाइल धाराओं को किस समय खोला जा रहा है, न कि उस समय खोला जा रहा है - जैसे कि इन झंडे को निर्दिष्ट करने से लॉक को * कमजोर * एक की आवश्यकता होती है, इसलिए आपका कथन गलत है। – BrokenGlass

+0

स्पष्टीकरण – skajfes

+0

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

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