c# - मैं एक फ़ाइल को कैसे खोलूं जो किसी अन्य एप्लिकेशन में खोला गया है




excel file-io (3)

आप फ़ाइल को खोलने की कोशिश कैसे कर रहे हैं?

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

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

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

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

https://code.i-harness.com

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

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

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


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


.NET के लिए स्प्रेडशीट गियर कार्यपुस्तिकाओं को पढ़ सकता है जबकि Excel उन्हें खोलता है। यहां वह कोड है जिसका हम उपयोग करने के लिए उपयोग करते हैं (ध्यान दें कि हम एक्सेल या किसी अन्य ऐप को लिखने के बीच में लिखने के लिए खोलने के बाद पूरी फ़ाइल को लॉक करते हैं):

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;
}

अस्वीकरण: मेरे पास स्प्रेडशीट गियर एलएलसी है





file-io