2012-02-23 14 views
5

सी # 4.0 में में है कैसे पता लगाने के लिए, MemoryMappedFile कई कारखाने तरीकों है: CreateFromFile, CreateNew, CreateOrOpen, या OpenExisting। यदि यह मौजूद है, तो मुझे MemoryMappedFile खोलने की आवश्यकता है, और यदि नहीं, तो इसे फ़ाइल से बनाएं। स्मृति नक्शा खोलने के लिए मेरे कोड इस तरह दिखता है:अगर एक MemoryMappedFile उपयोग

try 
{ 
    map = MemoryMappedFile.OpenExisting(
     MapName, 
     MemoryMappedFileRights.ReadWrite 
     | MemoryMappedFileRights.Delete); 
} 
catch (FileNotFoundException) 
{ 
    try 
    { 
     stream = new FileStream(
      FileName, 
      FileMode.OpenOrCreate, 
      FileAccess.ReadWrite, 
      FileShare.Read | FileShare.Delete); 
     map = MemoryMappedFile.CreateFromFile(
      stream, MapName, length + 16, 
      MemoryMappedFileAccess.ReadWrite, 
      null, 
      HandleInheritability.None, 
      false); 
    } 
    catch 
    { 
     if (stream != null) 
      stream.Dispose(); 
     stream = null; 
    } 
} 

यह बहुत ज्यादा तरह से मैं यह करना चाहते हैं काम करता है, लेकिन यह भी अक्सर OpenExisting रास्ते पर एक अपवाद फेंक समाप्त होता है। OpenExisting कॉल करने का प्रयास करने से पहले MemoryMappedFile वास्तव में मौजूद है या नहीं, यह जांचने का कोई तरीका है? या क्या मुझे हर बार अपवाद से निपटना है?

इसके अलावा, यह पता लगाने का कोई तरीका है कि मौजूदा हैंडल MemoryMappedFile खुला है, यह निर्धारित करने के लिए कि वर्तमान हैंडल का निपटारा होने पर फ़ाइल बंद हो जाएगी या नहीं?

+0

मुझे आपका प्रश्न नहीं मिला है। आपका क्या मतलब है "लेकिन यह ओपनएक्सस्टिंग तरीके पर अक्सर एक अपवाद फेंकता है"? – Krizz

+1

यदि मैं पहले CreateFromFile को आजमाता हूं, तो यह अपवाद फेंकता है अगर यह पहले से खुला है, अगर मैं पहले OpenExisting को आजमाता हूं, तो यह खुला नहीं होने पर अपवाद फेंकता है। यदि यह मौजूद है तो यह जांच कर यदि मैं संभव हो तो उन अपवादों से पूरी तरह से बचना चाहता हूं। मैं केवल असाधारण परिस्थितियों में अपवादों से निपटना चाहता हूं, हर बार जब यह कोड की उस पंक्ति को हिट नहीं करता है। –

+1

यह वास्तविक समस्या नहीं है, आपको एमएमएफ वास्तव में उपयोग करने योग्य बनाने के लिए चरण # 2 पर काम करने की आवश्यकता है। मैप किए गए मेमोरी को कौन सी प्रक्रिया लिख ​​सकती है इसे नियंत्रित करने के लिए कम से कम एक नामित म्यूटेक्स की आवश्यकता होती है। उन प्रक्रियाओं में से एक मालिक होना चाहिए, यदि आप करेंगे तो arbiter। इसे पहले शुरू करने की जरूरत है। –

उत्तर

0

देखें हान Passant की टिप्पणी। चूंकि मैं इसे स्वीकार किए जाने के रूप में चिह्नित नहीं कर सकता, इसलिए मैं इसे यहां संदर्भित करूँगा और इसे स्वीकार किए जाने के रूप में चिह्नित करूंगा।

0

आप MemoryMappedFile.CreateOrOpen उपयोग कर सकते हैं: स्वीकार किए जाते हैं जवाब के लिए मूल प्रश्न के तहत

map = MemoryMappedFile.CreateOrOpen(
       MapName, length + 16, 
       MemoryMappedFileAccess.ReadWrite, 
       MemoryMappedFileOptions.None, null, HandleInheritability.None); 
+1

समस्या यह है कि, केवल एक मेमोरी-केवल नक्शा बनाता है, यह मैपिंग को फाइल सिस्टम फ़ाइल में अनुमति नहीं देता है। खोले जाने के बाद फ़ाइल में इसे हुक करने का कोई तरीका है? –

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