2009-06-26 20 views
6

Tôi đang phát triển một ứng dụng đang đọc và viết rất nhiều (nhưng đồng bộ, mặc dù) vào một tệp nhất định trên đĩa. Tuy nhiên, làm thế nào lớn hơn các tập tin được, càng thường xuyên hơn tôi nhận được sau IOException:Điều gì xảy ra khi 'thao tác được yêu cầu không thể được thực hiện trên một tệp có phần do người dùng ánh xạ mở?'

Các hoạt động yêu cầu không thể được thực hiện trên một tập tin với một người dùng ánh xạ phần mở.

occuring từ:

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
    at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) 
    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) 
    at System.IO.StreamWriter.CreateFile(String path, Boolean append) 
    at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize) 
    at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding) 
    at System.IO.File.WriteAllText(String path, String contents, Encoding encoding) 
    at System.Windows.Forms.Control.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
    at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
    at System.Windows.Forms.Button.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
    at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
    at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.Run(Form mainForm) 
    at TestApp.Program.Main() 

Như bạn có thể thấy, các ngoại lệ được ném từ bên trong File.WriteAllText. Tôi nghi ngờ ngoại lệ phải làm với việc đọc và ghi đồng thời, do đó, cố gắng hạn chế quyền truy cập vào tệp. Cả hai số lockMutex dường như tăng số lượng ngoại lệ thay vì ngăn chặn chúng. Vì vậy, những gì chính xác đang xảy ra? Ngoại lệ này chính xác có ý nghĩa gì và nó có thể được ngăn chặn như thế nào?

Trả lời

0

Tôi đã viết thư cho một tệp (mở, vòng lặp (viết), đóng) nhưng sau khi một lỗi trùng lặp cuộc gọi đến rutine ... vì vậy tôi kết thúc bằng "Không thể thực hiện thao tác được yêu cầu trên tệp một phần do người dùng ánh xạ mở. "! Vâng, tôi đã xóa cuộc gọi thứ hai và sau đó giải quyết được sự cố. Có vẻ như hai (mở/đóng) (mở/đóng) rutines trên cùng một tập tin xảy ra quá sớm cái khác gây ra điều này ... Một số nhà phát triển đề nghị gọi gc. Kiểm tra để đóng chính xác mọi hoạt động i/o. Không thực hiện đầy đủ (mở, lặp (viết), đóng) quá sớm. Có vẻ như khi một hoạt động nó sẽ được hoàn thành trong khi yêu cầu thứ hai đến và điều đó gây ra vấn đề.

+0

Tôi nghĩ đây cũng là trường hợp trong tình huống của tôi. Không chắc chắn nguyên nhân của vấn đề chính xác là gì và vấn đề nên được ngăn chặn như thế nào. – dbaw

0

Điều này vẫn xảy ra ngay cả chỉ với một luồng/quy trình?

Nếu có, đó không phải là vấn đề về luồng.

Nếu không, bạn có thể không sử dụng mutex/khóa chính xác. Có lẽ bạn nên đăng các mã có liên quan ở đây.

+0

Tôi chắc chắn chỉ có một quy trình với một chuỗi, vì vậy có thể tôi không cần khóa hoặc mutex. Nhưng điều gì sẽ xảy ra nếu quá trình này cố gắng đọc (hoặc viết) một tập tin mà chỉ trong quá trình được giải phóng (từ người đọc hoặc nhà văn đang truy cập nó)? Hơn nữa, thông điệp ngoại lệ thực sự có ý nghĩa gì? – dbaw

+0

Câu trả lời cho các câu trả lời được thêm vào sau: Không, tôi không có bất kỳ chương trình chống vi-rút nào đang chạy .. – dbaw

1

Bạn có bật phần mềm quét vi-rút thời gian thực không?

Tôi đã mất số lần xảy ra sự cố khóa tệp do phần mềm quét vi-rút gây ra.

1

Tôi đã nhìn thấy thông báo này khi trình gỡ lỗi Visual Studio lấy một nút và khóa tệp PDB.

Điều đó có thể không liên quan đến trường hợp của bạn, nhưng bạn có thể xác nhận xem tệp có bị khóa hay không bằng cách sử dụng tiện ích có thể tải xuống được gọi là "Trình mở khóa" có thể phát hiện và xóa khóa trên tệp và thư mục.

6

Giải pháp đầu tiên là tắt tính năng chống vi-rút của bạn. Tốt hơn bạn vẫn có thể thêm thư mục vào danh sách ngoại lệ quét của phần mềm chống vi rút.

0

Với tôi, có vẻ như bạn có một số quy trình khác mở tất cả các tệp được sửa đổi với các quyền có nghĩa là bạn không thể mở tệp để sửa đổi. Điều này có thể là chống vi-rút, sao lưu trực tuyến, đồng bộ hóa tệp trực tuyến ...

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