2012-02-23 41 views
5

Trong C# 4.0, MemoryMappedFile có một số phương pháp nhà máy: CreateFromFile, CreateNew, CreateOrOpen hoặc OpenExisting. Tôi cần mở MemoryMappedFile nếu nó tồn tại và nếu không, hãy tạo nó từ một tệp. Mã của tôi để mở bản đồ bộ nhớ trông như thế này:Cách phát hiện xem MemoryMappedFile có đang sử dụng không

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

Nó khá nhiều hoạt động theo cách tôi muốn nó, nhưng nó kết thúc lên ném một ngoại lệ trên OpenExisting cách quá thường xuyên. Có cách nào để kiểm tra xem MemoryMappedFile thực sự tồn tại trước khi tôi cố gắng thực hiện cuộc gọi OpenExisting? Hay tôi phải đối phó với ngoại lệ mỗi lần?

Ngoài ra, có cách nào để tìm hiểu xem trình xử lý hiện tại có phải là lệnh cuối cùng để mở khóa MemoryMappedFile không, để xác định xem tệp có bị đóng khi xử lý hiện tại được xử lý không?

+0

Tôi không nhận được câu hỏi của bạn. Những gì bạn có nghĩa là bởi "nhưng nó kết thúc ném một ngoại lệ trên OpenExisting cách quá thường xuyên"? – Krizz

+1

Nếu tôi thử CreateFromFile đầu tiên, nó ném một ngoại lệ nếu nó đã được mở, nếu tôi thử OpenExisting đầu tiên, nó ném một ngoại lệ nếu nó không mở. Tôi muốn hoàn toàn tránh những ngoại lệ nếu có thể bằng cách kiểm tra xem nó có tồn tại không. Tôi chỉ muốn đối phó với ngoại lệ trong những trường hợp thực sự đặc biệt, không phải mỗi lần nó tấn công vào dòng mã đó. –

+1

Đây không phải là một vấn đề thực sự, bạn cần phải làm việc trên bướC# 2 để làm cho MMF thực sự có thể sử dụng được. Điều đó đòi hỏi ít nhất một mutex được đặt tên để kiểm soát quá trình nào có thể ghi vào bộ nhớ được ánh xạ. Một trong những quy trình đó phải là ông chủ, trọng tài nếu bạn muốn. Nó cần phải bắt đầu đầu tiên. –

Trả lời

0

Xem Han passant dưới câu hỏi ban đầu cho câu trả lời được chấp nhận. Vì tôi không thể đánh dấu nó là được chấp nhận, tôi sẽ chỉ đề cập đến nó ở đây và đánh dấu điều này là được chấp nhận.

0

Bạn có thể sử dụng MemoryMappedFile.CreateOrOpen: Cảm nhận

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

Vấn đề là, chỉ tạo ra một bản đồ bộ nhớ, nó không cho phép ánh xạ tới một tệp hệ thống tệp. Có cách nào để móc nó vào một tập tin sau khi nó đã được mở? –

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