Khi tôi mở một tệp, tôi muốn biết liệu nó có đang được sử dụng bởi một quy trình khác không. thực hiện xử lý đặc biệt; bất kỳ IOException khác tôi sẽ bong bóng lên. Thuộc tính Message của IOException chứa "Quá trình không thể truy cập tệp 'foo' vì nó đang được sử dụng bởi một tiến trình khác.", Nhưng điều này không phù hợp cho việc phát hiện có lập trình. Cách an toàn nhất, mạnh mẽ nhất để phát hiện tệp đang được sử dụng bởi quy trình khác là gì?Làm thế nào để biết nếu một IOException bị bắt gặp là do tệp đang được sử dụng bởi một tiến trình khác, mà không cần phải phân tích cú pháp thuộc tính Message của
Trả lời
Đây là phiên bản đặc biệt của IOException
được ném khi mã lỗi trả về từ hàm Win32 là ERROR_SHARING_VIOLATION
(Documentation). Nó có giá trị số của 0x20
nhưng thực sự được lưu trữ như 0x80070020
trên HRESULT
tài sản của ngoại lệ (đó là kết quả gọi MakeHRFromErrorCode).
vì vậy, cách programatic kiểm tra vì vi phạm chia sẻ được kiểm tra HResult
tài sản trên IOException
cho giá trị 0x80070020
.
public static bool IsSharingViolation(this IOException ex) {
return 0x80070020 == Marshal.GetHRForException(ex);
}
Tuy nhiên, tôi đặt câu hỏi chính xác bạn muốn làm gì trong trường hợp nó được đưa ra do vi phạm chia sẻ. Thời điểm ngoại lệ được ném vào quá trình khác có thể thoát ra và do đó loại bỏ vi phạm.
Tại sao không sử dụng 'ex.HResult' trực tiếp thay vì' Marshal.GetHRForException'? –
@Anders vì tài sản HResult có mức độ truy cập được bảo vệ nên thường không thể truy cập được. – JaredPar
Câu trả lời tuyệt vời JaredPar, cảm ơn ... Để trả lời câu hỏi của bạn; Tôi cần phải phát hiện kịch bản này vì tôi cần một thông điệp thân thiện cho lớp trình bày - sẽ ổn nếu xung đột có thể không tồn tại ngay sau đó, do bản chất của ứng dụng của tôi ... cảm ơn một lần nữa –
tôi không có đủ "đại diện" để bình luận vì vậy hy vọng "câu trả lời" đây là OK ...
Câu trả lời được chấp nhận là chính xác những gì tôi đang tìm kiếm và hoạt động hoàn hảo, nhưng người ở đây và trên tương tự câu hỏi đã đặt câu hỏi về tiện ích kiểm tra xem tệp có bị khóa hay không. Đúng là một hàm tiện ích để kiểm tra xem một tệp có bị khóa không được sử dụng nhiều hay không bởi vì trên báo cáo tiếp theo, trạng thái có thể đã thay đổi.
Nhưng mẫu thử hoạt động khóa và sau đó phản hồi khác nhau để khóa lỗi so với lỗi chung là hợp lệ và hữu ích. Điều rõ ràng nhất cần làm là chờ một chút và thử lại thao tác. Điều này có thể được khái quát hóa thành một hàm helper như thế này:
protected static void RetryLock(Action work) {
// Retry LOCK_MAX_RETRIES times if file is locked by another process
for (int i = 1; i <= LOCK_MAX_RETRIES; i++) {
try {
work();
return;
} catch (IOException ex) {
if (i == LOCK_MAX_RETRIES || (uint) ex.HResult != 0x80070020) {
throw;
} else {
// Min should be long enough to generally allow other process to finish
// while max should be short enough such that RETRIES * MAX isn't intolerable
Misc.SleepRandom(LOCK_MIN_SLEEP_MS, LOCK_MAX_SLEEP_MS);
}
}
}
} // RetryLock
... mà sau đó có thể được sử dụng như thế này:
public string DoSomething() {
string strReturn = null;
string strPath = @"C:\Some\File\Path.txt";
// Do some initial work...
//----------------------------------------------------------------------------------------------------
// NESTED FUNCTION to do main logic, RetryLock will retry up to N times on lock failures
Action doWork = delegate {
using (FileStream objFile = File.Open(strPath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) {
// Does work here if lock succeeded, else File.Open will throw ex
strReturn = new StreamReader(objFile).ReadLine();
}
}; // delegate doWork
//----------------------------------------------------------------------------------------------------
RetryLock(doWork); // Throws original ex if non-locking related or tried max times
return strReturn;
}
... dù sao, chỉ cần gửi bài trong trường hợp ai đó có nhu cầu tương tự như tìm thấy mô hình hữu ích.
Nếu bạn đang sử dụng C# 6 đây là tình huống hoàn hảo để sử dụng các ngoại lệ được lọc 'catch (IOException ex) khi (i
- 1. Làm thế nào tôi có được thuộc tính sử dụng bởi XMLPull phân tích cú pháp
- 2. Trình phân tích cú pháp phân tích cú pháp Haskell để gặp phải [...]
- 3. Filehelpers Phân tích cú pháp CSV. Làm thế nào để sử dụng thuộc tính FieldQuoted?
- 4. Trình tạo phân tích cú pháp không cần quét
- 5. Làm cách nào để buộc trình phân tích cú pháp SAX sử dụng DTD nếu một tệp không được chỉ định trong tệp đầu vào?
- 6. NUnit: "Quá trình không thể truy cập tệp ... vì nó đang được sử dụng bởi một tiến trình khác."
- 7. Phân tích cú pháp mà không cần tách chuỗi
- 8. Có một trình phân tích cú pháp/cách nào có sẵn để phân tích cú pháp các tệp kết xuất Wikipedia bằng cách sử dụng Python không?
- 9. Không thể truy cập tệp vì nó đang được sử dụng bởi một quy trình khác
- 10. Chuỗi phân tích cú pháp là thuộc tính
- 11. Cần trình phân tích cú pháp C++
- 12. Cần một sự kiện CDATA thông báo cho trình phân tích cú pháp stax cho java
- 13. Làm cách nào để nắm bắt các sự kiện thuộc tính với trình phân tích cú pháp XML của StAX?
- 14. Sử dụng JavaScript để phân tích cú pháp tệp XML
- 15. Tệp được sử dụng bởi một quy trình khác
- 16. Làm cách nào để phân tích cú pháp dữ liệu JSON khi tên thuộc tính không được biết trước?
- 17. Làm thế nào để viết một trình phân tích cú pháp gốc đệ quy từ đầu?
- 18. Phân tích cú pháp các tệp văn bản lớn, được sửa đổi khi đang bay
- 19. Tệp đang được sử dụng bởi một quy trình khác sau khi tệp File.Copy
- 20. Làm thế nào để có được uuid mach-o của một tiến trình đang chạy?
- 21. Làm thế nào để biết nếu UserControl đang hoạt động khác hơn là sử dụng IsFocused
- 22. Làm cách nào để sử dụng API phân tích cú pháp của Google Json (Gson) để phân tích cú pháp một số trường động trong json của tôi?
- 23. UIWebView đang tải chuỗi html được phân tích cú pháp
- 24. làm cách nào để phân tích cú pháp tệp dtd
- 25. Làm thế nào để phân tích cú pháp một tệp M3U8 trong Mục tiêu C?
- 26. C# File.Delete, tệp đang được sử dụng bởi một quy trình khác
- 27. TouchXML phân tích cú pháp thuộc tính XML
- 28. Loại trình phân tích cú pháp nào cần thiết cho ngữ pháp này?
- 29. lạnh lỗi phân tích cú pháp, không phải là một chuỗi
- 30. Trình phân tích cú pháp SSI được viết bằng PHP?
Loại thực sự là một IOException hay là một trong các kiểu bắt nguồn từ IOException? –
Không quan tâm, tại sao bạn cần phát hiện điều này theo chương trình? Bạn dự định làm gì khi bạn đã phát hiện ra rằng một quy trình khác đang sử dụng tệp của bạn? –
@Mark Byers, xem nhận xét của tôi về câu trả lời được chấp nhận. –