2009-06-26 13 views
20

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

मैं जो करना चाहता हूं वह मेरे आवेदन को फ़ाइल में पढ़ने की इजाजत देता है, भले ही यह एक्सेल में खुला है, उपयोगकर्ता को वर्कशीट को बंद करने के लिए मजबूर करने के बजाय। ध्यान दें कि प्रश्न में आवेदन केवल फ़ाइल को पढ़ने की जरूरत है, इसे लिखने के लिए नहीं।

क्या यह संभव है?

उत्तर

26

आप FileShare.ReadWrite गुजर जब फ़ाइल को खोलने की कोशिश कर सकते:

using (var stream = new FileStream(
     @"d:\myfile.xls", 
     FileMode.Open, 
     FileAccess.Read, 
     FileShare.ReadWrite)) 
{ 

} 
+0

मुझे लगता है कि फ़ाइलशेयर ध्वज अन्य मामले के लिए है - जब आप अन्य अनुप्रयोगों को फ़ाइल – ChrisF

+0

फ़ाइल तक पहुंचने की अनुमति देना चाहते हैं, तो मेटा डेटा से: "इस तरह की पहुंच को नियंत्रित करने के लिए स्थिरांक शामिल है अन्य System.IO.FileStream ऑब्जेक्ट्स को एक ही फाइल " – ChrisF

+4

हो सकती है, भविष्य के सलामी बल्लेबाजों के मामले में, एक फ़ाइलशेयर। रीड का अर्थ है" भविष्य के सलामी बल्लेबाज पढ़ने के लिए फ़ाइल खोल सकते हैं "। पिछले सलामी बल्लेबाजों के मामले में, FileShare.Read का अर्थ है "इस फ़ाइल को केवल मेरे लिए खोलें यदि उसके पास पिछले ओपनर्स हैं जो इसे पढ़ने के लिए खोले हैं"। यही कारण है कि FileShare.ReadWrite का उपयोग यहां किया जाना चाहिए, क्योंकि Excel लेखन के लिए फ़ाइल खोलता है। –

6

आप फ़ाइल को खोलने का प्रयास कैसे कर रहे हैं?

यदि आप इसे पढ़ने/लिखने के लिए खोलने की कोशिश कर रहे हैं तो आपको अपवाद मिलेगा। यदि आप इसे केवल पढ़ने के लिए खोलने की कोशिश कर रहे हैं तो आपको ठीक होना चाहिए।

var file = File.Open("file.xls", FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

यह तभी एक्सेल FileShare.Read सेट के साथ फ़ाइल खोल दिया है अन्य अनुप्रयोगों (यानी आपका का) फ़ाइल का उपयोग करने की अनुमति देने के लिए काम करेंगे। यदि यह सेट नहीं है तो Excel ने विशेष पहुंच के साथ फ़ाइल खोली होगी। नोट: मुझे नहीं लगता कि यह मामला है क्योंकि आप एक्सेल फ़ाइल (एक्सेल में) को पढ़ने के लिए खोल सकते हैं अगर किसी और ने इसे संपादित करने के लिए खोल दिया हो।

अद्यतन - ठीक है मैंने डारिन की टिप्पणियों के बाद तक यह ठीक से परीक्षण नहीं किया। सहायता के बावजूद आपको FileShare.ReadWrite ध्वज की आवश्यकता है, यह दर्शाता है कि यह बाद के फ़ाइल ओपनर्स के लिए है। FileShare.Read भी पर्याप्त नहीं है, जो मुझे भी गंध लगता है।

+0

यह सही नहीं है। FileShare.Read का उपयोग करना मतलब है: "इस फ़ाइल को केवल मेरे लिए खोलें यदि किसी भी पूर्व सलामी बल्लेबाज ने इसे पढ़ने के लिए खोला है।" जो मामला नहीं है क्योंकि एक्सेल ने इसे लिखने के लिए खोला है। –

+2

@ डारिन - मैं फाइलशेयर का उपयोग नहीं कर रहा हूं। – ChrisF

+0

अच्छा जवाब। दरअसल, एक्सेल फाइलें विशेष पहुंच के साथ नहीं खोली जाती हैं, इसलिए यह विधि काफी संभव है। – Noldorin

0

पहले से ही खोला फ़ाइल की एक प्रतिलिपि बनाने का प्रयास करें, यह पढ़ सकते हैं और यह त्यागें। यह जांचने के लिए कि फ़ाइल पहले ही खोली गई है, प्रतिलिपि पढ़ने, पढ़ने, त्यागने के द्वारा अपवाद को पढ़ने और संभालने का प्रयास करें।

1

एक्सेल के खुले होने पर कार्यपुस्तिकाएं पढ़ सकते हैं।

stream = new System.IO.FileStream(path, 
    System.IO.FileMode.Open, 
    System.IO.FileAccess.Read, 
    System.IO.FileShare.ReadWrite, 
    SG.CompoundDocumentIO.Storage.OpenBufferLength); 
try 
{ 
    stream.Lock(0, stream.Length); 
} 
catch 
{ 
    // .NET 1.1 requires cast to IDisposable 
    ((IDisposable)stream).Dispose(); 
    throw; 
} 

अस्वीकरण:: यहाँ कोड हम यह करने के लिए (ध्यान दें कि हम उद्घाटन के बाद पूरी फ़ाइल ताला लिखने से एक्सेल या किसी अन्य अनुप्रयोग रखने के लिए जब तक हम पढ़ने के बीच में हैं) का उपयोग है मैं खुद SpreadsheetGear एलएलसी

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