2012-12-03 28 views
6

Có cách nào đơn giản để phát hiện xem tệp có được mở trong bất kỳ quy trình nào trong Windows không?Cách lập trình để phát hiện xem tệp có được mở trong Windows không?

Ví dụ: tôi đang theo dõi thư mục và nếu tệp được đặt vào thư mục, tôi muốn thực hiện một số thao tác trên các tệp này.

Tôi không muốn thực hiện các tác vụ này, nếu các tệp vẫn đang được sao chép vào thư mục hoặc nếu nội dung của các tệp này vẫn đang được cập nhật.

Vì vậy, những gì đang xảy ra là đặt tên tệp, tôi muốn triển khai hàm, chẳng hạn như hàm IsFileOpenedAnywhereElseInAnyProcess(const PathName: string): Boolean, trả về true hoặc false.

Một trong những cách tôi có thể nghĩ ra, là để đổi tên tập tin, và nếu đổi tên thành công, không có quy trình khác đã mở các tập tin Tôi quan tâm đến, như vậy:

function IsFileOpenedAnywhereElseInAnyProcess(const PathName: string): Boolean; 
begin 
    Result := not (MoveFileEx(PathName, PathName+'.BLAH', 0) and MoveFileEx(PathName+'.BLAH', PathName, 0)); 
end; 

Logic là nếu tôi có thể đổi tên tập tin (để mở rộng khác) sau đó đổi tên nó trở lại, nó không được mở bởi bất kỳ quá trình khác (tại thời điểm kiểm tra).

Cảm ơn.

+0

Bạn đang sử dụng C++, C#? –

Trả lời

8
IsFileOpenedAnywhereElseInAnyProcess(const PathName: string): Boolean 

Đó là chức năng mà bạn không bao giờ có thể triển khai chính xác trên hệ điều hành đa tác vụ. Bạn sẽ nhận được một sự trở lại sai và một nano giây sau một quá trình khác sẽ mở tập tin và hủy hoại ngày của bạn.

Cách duy nhất để làm điều này một cách chính xác là làm điều này một cách nguyên tử, thực sự đang cố mở tệp. Và chỉ định không chia sẻ để không có quá trình nào khác có thể mở tệp. Điều đó sẽ không thành công với ERROR_SHARING_VIOLATION nếu một quy trình khác đã giành được quyền truy cập vào tệp. Tại thời điểm đó bạn sẽ phải đợi một lúc và thử lại sau.

+0

Một câu trả lời thực sự tốt đẹp Hans và một tôi sẽ tiết kiệm cho sau = D – garfbradaz

+0

@ hans-passant, làm thế nào là một tập tin mở ra xác định không chia sẻ? Tôi đang sử dụng hàm '_findfirst', nhưng trang MSDN không đề cập đến việc chia sẻ như với các tệp ẩn (ví dụ) [https://msdn.microsoft.com/en-us/library/kda16keh.aspx] –

+0

Chức năng đó chỉ đơn thuần là định vị các tập tin, nó không mở chúng. Sử dụng CreateFile hoặc _fsopen. –

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