Thuộc tính System.Exception.HResult được bảo vệ. Làm thế nào tôi có thể nhìn trộm bên trong một ngoại lệ và nhận được HResult mà không phải dùng đến sự phản chiếu hoặc các hacks xấu xí khác?Làm cách nào để xác định HResult cho System.IO.IOException?
Đây là tình hình:
Tôi muốn viết một công cụ sao lưu, mở ra và đọc tập tin trên một hệ thống. Tôi mở tệp bằng FileAccess.Read và FileShare.ReadWrite, theo số this guidance, vì tôi không quan tâm liệu tệp đó có mở để viết vào thời điểm tôi đọc hay không.
Trong một số trường hợp, khi một tệp mà tôi đang đọc mở bởi một ứng dụng khác, phương thức System.IO.FileStream.Read() ném một System.IO.IOException, "Quá trình này không thể truy nhập tệp vì một quy trình khác có đã khóa một phần của tệp ". Đây là error 33, hoặc tôi nghĩ HResult 0x80070021. [EDIT: Tôi tin rằng điều này có thể được trả lại khi một quy trình khác gọi LockFileEx để khóa phạm vi byte trong một tệp.]
Tôi muốn tạm dừng và thử lại khi tôi gặp lỗi này. Tôi nghĩ đây là hành động thích hợp để thực hiện ở đây. Nếu quá trình khóa phát hành khóa phạm vi byte một cách nhanh chóng, thì tôi có thể tiếp tục đọc tệp.
Làm cách nào để phân biệt một IOException vì lý do này, với những người khác? Tôi có thể nghĩ theo những cách sau:
- phản ánh riêng tư - không muốn làm điều đó. Perf sẽ bốc mùi.
- gọi Exception.ToString() và phân tích cú pháp chuỗi. Cảm thấy hacky. Sẽ không hoạt động trong các phiên bản i18n.
Tôi không thích các tùy chọn này. Không có cách nào tốt hơn, sạch hơn?
Tôi vừa tìm kiếm và tìm thấy System.Runtime.InteropServices.Marshal.GetHRForException. Điều đó sẽ trả về một uint như 0x80070021?
> phản ánh riêng - không muốn làm điều đó. Perf sẽ bốc mùi. - Dù sao thì ngoại lệ stinks cũng vậy, nên tôi sẽ không lo lắng về khía cạnh hoàn hảo. Reflection hiện - tuy nhiên - yêu cầu FullTrust, là xấu xí, và không được hỗ trợ và dễ bị vỡ - đó là lý do tại sao bạn không nên làm điều đó. –