2009-08-03 21 views
11

Tôi muốn phát xung quanh bằng cách sử dụng MemoryMappedFile để truy cập tệp nhị phân hiện có. Nếu điều này thậm chí có thể hoặc tôi là một người điên?UnauthorizedAccessException trên MemoryMappedFile trong C# 4

Ý tưởng sẽ là ánh xạ tệp nhị phân hiện có trực tiếp vào bộ nhớ cho một số hoạt động tốt hơn tốc độ cao hơn. Hoặc để ít nhất xem làm thế nào những điều này làm việc.

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

tôi nhận được System.UnauthorizedAccessException là unhandled (Message = Truy cập vào các con đường bị từ chối.) Trên dòng mf.CreateViewAccessor().

Tôi không nghĩ rằng đó là quyền của tệp, vì tôi đang chạy với tư cách là người dùng quản trị viên không an toàn và không có bất kỳ chương trình nào khác mở có thể có khóa đọc trên tệp. Đây là trên Vista với UAC vô hiệu hóa.

Nếu đơn giản là không thể và tôi đã bỏ sót điều gì đó trong tài liệu, vui lòng cho tôi biết. Tôi hầu như không thể tìm thấy bất cứ điều gì ở tất cả tham chiếu tính năng này của .net 4.0

Cảm ơn!

Trả lời

1

Rất khó để nói điều gì có thể xảy ra. Vì chưa có tài liệu trên trang web MSDN, tốt nhất bạn nên cài đặt FILEMON từ SysInternals và xem tại sao điều đó lại xảy ra.

Cách khác, bạn có thể đính kèm trình gỡ lỗi gốc (như WinDBG) vào quy trình và đặt điểm ngắt trên MapViewOfFile và các tình trạng quá tải khác. Và sau đó xem tại sao cuộc gọi đó không thành công.

1

Sử dụng .CreateViewStream() từ thể hiện của MemoryMappedFile đã xóa lỗi khỏi mã của tôi. Tôi đã không thể nhận được .CreateViewAcccessor() hoạt động w/lỗi truy cập bị từ chối

16

Tôi biết đây là một câu hỏi cũ, nhưng tôi chỉ chạy vào cùng một lỗi và có thể giải quyết nó.

Mặc dù tôi đã mở MemoryMappedFile như read-only (MemoryMappedFileRights.Read) như bạn đang có, tôi cũng cần để tạo ra các quan điểm accessor như read-only cũng như:

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

Sau đó, nó làm việc. Hy vọng điều này sẽ giúp người khác.

+2

Để tạo trình truy cập cho toàn bộ tệp, hãy sử dụng 'CreateViewAccessor (0, 0, MemoryMappedFileAccess.Read)' –

6

Nếu kích thước lớn hơn độ dài tệp, nó cho phép ngoại lệ Truy cập không được phép. Vì chúng tôi đang cố truy cập bộ nhớ vượt quá giới hạn của tệp.

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

Tôi vừa gặp sự cố này. Câu lệnh là 'mmf.CreateViewStream (contentInfo.From, contentInfo.Length, MemoryMappedFileAccess.Read)' nhưng phải là 'mmf.CreateViewStream (contentInfo.From, contentInfo.Length - 1, MemoryMappedFileAccess.Read)'. Ban đầu tôi đi săn lùng loại vấn đề ACL nhưng bây giờ tôi hiểu nó có nghĩa là 'vi phạm truy cập bộ nhớ' – rism

Các vấn đề liên quan