2011-01-27 27 views
9

thể trùng lặp:
How do I find out which process is locking a file using .NET?Làm thế nào tôi có thể lập trình xác định ứng dụng nào đang khóa một tệp?

Tôi muốn sao chép một tập tin nhưng nó đang bị khóa bởi một ứng dụng khác, do đó, một FileInUseException được ném. Tôi muốn thông báo cho người dùng biết ứng dụng nào đang khóa tệp mà tôi đang cố gắng sao chép. Có cách nào trong .NET Framework để làm điều này? Nếu không có kiến ​​thức này, tôi đang sử dụng để nói cho người dùng sử dụng ứng dụng Unlocker.

+3

Trùng lặp: http://stackoverflow.com/questions/317071/how-do-i-find-out-which-process-is-locking-a-file-using-net –

+0

Câu trả lời ở đây có thể được hợp nhất bằng cách nào đó không với câu hỏi trùng lặp? –

+0

Vui lòng không xóa câu hỏi này. Câu hỏi khác có thể tương đương về mặt bản thể học nhưng nó không khớp với tìm kiếm của tôi. Câu hỏi này có thành tích ở chỗ nó hỗ trợ một đường dẫn truy cập khác. –

Trả lời

4

Bạn có thể thử mã được cung cấp trong this question over here hoặc xem other suggestions here.

Cách tiếp cận chung là liệt kê các chốt của tất cả các quy trình, có các đường dẫn tập tin của những tay cầm, và so sánh với các tập tin bạn quan tâm.

Nhưng một vấn đề với phương pháp này là ngay cả khi bạn có thể xác định rằng tập tin bị khóa và ứng dụng nào có khóa tập tin sau đó bạn vẫn sẽ phải đối phó với điều kiện chủng tộc, ví dụ ...

một phần nghìn giây sau

  • file không bị khóa
  • ứng dụng mà đã giữ khóa tại là không

sau đó hai phần nghìn giây sau

  • tập tin bị khóa (một lần nữa)
  • một ứng dụng khác nhau có khóa

sau đó ba mili giây sau

  • tập tin vẫn còn bị khóa
  • chưa ứng dụng khác có khóa

... vv

One suggestion là để cố gắng để có được các tập tin xử lý trong ứng dụng của bạn, và nắm bắt những ngoại lệ khi bạn có thể' t.

try 
{ 
    using (Stream stream = new FileStream("MyFilename.txt")) 
    { 
    } 
} catch { 
    //check here why it failed and ask user to retry if the file is in use. 
} 

Tất nhiên điều này sẽ không giúp xác định (các) thủ phạm nhưng ít nhất bạn có cách an toàn hơn để truy cập tệp.

3

Lưu ý các lỗi mà Ed đã chỉ ra, trên Vista sau, bạn có thể sử dụng API khởi động lại trình quản lý để thực hiện việc này (ngay cả khi ứng dụng của bạn không phải là trình cài đặt).

Bạn tạo phiên mới, đăng ký tệp quan tâm, sau đó gọi RmGetList để nhận danh sách ứng dụng hoặc dịch vụ có xử lý trên tệp. Bạn thậm chí có thể bắt đầu khởi động lại các ứng dụng đó nếu chúng khởi động lại Trình quản lý khởi động mà không cần liên quan đến người dùng.

Rõ ràng, Trình quản lý khởi động lại là một API Win32, nhưng bạn sẽ có thể P/Gọi vào nó. Bài viết này: http://msdn.microsoft.com/en-us/magazine/cc163450.aspx có các chữ ký P/Invoke cần thiết cũng như các ví dụ sử dụng theo cách này.

+0

Liên kết không hoạt động. Bạn có thể cập nhật nó không? – Mardok

+0

@Mardok (và những người khác): Có một cuộc thảo luận về cách sử dụng Trình quản lý khởi động lại tại đây: http://stackoverflow.com/questions/1304/how-to-check-for-file-lock – RenniePet

+0

@RenniePet kiểm tra chuỗi trùng lặp - có một câu trả lời bằng cách sử dụng API RestartManager. Nó hoạt động tốt hơn. – Mardok

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