2009-08-03 7 views
11

में मेमोरीमैप्डफाइल पर अनधिकृत एक्सेस अपवाद, मौजूदा बाइनरी फ़ाइल तक पहुंचने के लिए मैं मेमोरी मैप किए गए फ़ाइल का उपयोग करने के साथ खेलना चाहता था। यदि यह भी संभव हो या मैं पागल व्यक्ति हूं?सी # 4

विचार कुछ मौजूदा उच्च गति वाले संचालन के लिए मौजूदा बाइनरी फ़ाइल को सीधे स्मृति में मैप करना होगा। या कम से कम यह देखने के लिए कि इन चीजें कैसे काम करती हैं।

 using System.IO.MemoryMappedFiles; 


     System.IO.FileInfo fi = new System.IO.FileInfo(@"C:\testparsercap.pcap"); 
     MemoryMappedFileSecurity sec = new MemoryMappedFileSecurity(); 
     System.IO.FileStream file = fi.Open(System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, System.IO.FileShare.ReadWrite); 
     MemoryMappedFile mf = MemoryMappedFile.CreateFromFile(file, "testpcap", fi.Length, MemoryMappedFileAccess.Read, sec, System.IO.HandleInheritability.Inheritable, true); 
     MemoryMappedViewAccessor FileMapView = mf.CreateViewAccessor(); 
     PcapHeader head = new PcapHeader(); 
     FileMapView.Read<PcapHeader>(0, out head); 

मैं System.UnauthorizedAccessException बिना क्रिया था (संदेश = पथ के लिए प्रवेश निषेध है।) Mf.CreateViewAccessor() लाइन पर।

मुझे नहीं लगता कि यह फ़ाइल-अनुमतियां है, क्योंकि मैं एक अच्छा असुरक्षित व्यवस्थापक उपयोगकर्ता के रूप में चल रहा हूं, और कोई अन्य प्रोग्राम नहीं खुलता है जिसमें फ़ाइल पर रीड-लॉक हो सकता है। यह Vista पर यूएसी अक्षम है।

यदि यह संभव नहीं है और मुझे दस्तावेज़ में कुछ याद आया, तो कृपया मुझे बताएं। मुझे .NET 4.0

धन्यवाद की इस सुविधा के संदर्भ में कुछ भी मुश्किल से मिल सकता है!

उत्तर

1

यह कहना मुश्किल है कि क्या गलत हो रहा है। चूंकि एमएसडीएन वेबसाइट पर अभी तक कोई दस्तावेज नहीं है, इसलिए आपकी सबसे अच्छी शर्त SysInternals से FILEMON स्थापित करना है, और देखें कि यह क्यों हो रहा है।

वैकल्पिक रूप से, आप प्रक्रिया में मूल डीबगर (जैसे WinDBG) संलग्न कर सकते हैं, और MapViewOfFile और अन्य ओवरलोड पर ब्रेकपॉइंट डाल सकते हैं। और फिर देखें कि वह कॉल क्यों विफल हो रही है।

1

MemoryMappedFile के उदाहरण से। CateateViewStream() का उपयोग करके मेरे कोड से त्रुटि हटा दी गई। मैं प्राप्त करने में असमर्थ था। CreateViewAcccessor() काम कर रहा है w/एक्सेस से इनकार किया गया त्रुटि

16

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं बस एक ही त्रुटि में भाग गया और इसे हल करने में सक्षम था।

हालांकि मैं के रूप में MemoryMappedFile खोलने गया था केवल पढ़ने के लिए (MemoryMappedFileRights.Read) के रूप में आप कर रहे हैं, मैं भी दृश्य एक्सेसर को रीड-ओनली रूप में अच्छी तरह बनाने के लिए आवश्यक:

var view = mmf.CreateViewAccessor(offset, size, MemoryMappedFileAccess.Read); 

तो यह काम किया। मनाइए कि यह किसी और के लिए सहायक हो।

+2

पूरी फ़ाइल के लिए एक्सेसर बनाने के लिए, का उपयोग 'CreateViewAccessor (0, 0, MemoryMappedFileAccess.Read)' –

6

यदि आकार फ़ाइल की लंबाई से अधिक है, तो यह अनधिकृत एक्सेस अपवाद देता है। क्योंकि हम फ़ाइल की सीमाओं से परे स्मृति तक पहुंचने का प्रयास कर रहे हैं।

var view = mmf.CreateViewAccessor(offset, size, MemoryMappedFileAccess.Read); 
+0

मैं सिर्फ इस समस्या थी। कथन 'mmf.CreateViewStream (contentInfo.From, contentInfo.Length, MemoryMappedFileAccess.Read) था, लेकिन' mmf.CreateViewStream (contentInfo.From, contentInfo.Length - 1, MemoryMappedFileAccess.Read) होना चाहिए था। मैं शुरुआत में एसीएल प्रकार की समस्या के लिए शिकार पर गया लेकिन अब मैं इसे 'स्मृति पहुंच उल्लंघन' का अर्थ समझता हूं – rism