2010-06-07 64 views
16

Có cách nào để tìm xem tệp có đang mở hay không?Kiểm tra xem tệp có đang mở

+2

Vui lòng cung cấp thêm chi tiết cụ thể. Đã được mở bởi quá trình của bạn, hoặc quá trình khác? Thời gian mở, hoặc chỉ mở bằng quyền ghi? Điều gì về việc chia sẻ? vv Câu hỏi này quá mơ hồ. – hemp

Trả lời

26
protected virtual bool IsFileinUse(FileInfo file) 
{ 
    FileStream stream = null; 

    try 
    { 
     stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
    } 
    catch (IOException) 
    { 
     //the file is unavailable because it is: 
     //still being written to 
     //or being processed by another thread 
     //or does not exist (has already been processed) 
     return true; 
    } 
    finally 
    { 
     if (stream != null) 
     stream.Close(); 
    } 
    return false; 
} 
+2

Nếu quá trình không có quyền ghi vào tệp, điều này sẽ tạo ra một kết quả gây hiểu lầm (mở sẽ thất bại, nhưng không nhất thiết là do một tay cầm tồn tại.) Mở để truy cập đọc sẽ ít bị lỗi hơn. – hemp

+4

Thật tuyệt vời khi hầu hết các ngôn ngữ không có phương pháp để kiểm tra tệp đang mở. Chúng tôi đã từng sử dụng cùng một kiểu phương thức trong C++ trong OS/2. tức là cố gắng mở tệp độc quyền. Nó hoạt động đủ tốt, nhưng tôi chưa bao giờ nghĩ nó thanh lịch. – Matt

+2

Nó không phải là một tính năng ngôn ngữ, nó là một tính năng hệ điều hành. Chỉ không tồn tại một API đơn giản (trong Windows) để truy vấn thông tin đó. Có thể nhận được, nhưng nó ở mức độ thấp và có rất nhiều tham số cần phải được xác định để biết điều gì có nghĩa là "mở". – hemp

7

Như @pranay rana, nhưng chúng ta cần phải chắc chắn rằng chúng tôi đóng xử lý tập tin của chúng tôi:

public bool IsFileInUse(string path) 
{ 
    if (string.IsNullOrEmpty(path)) 
    throw new ArgumentException("'path' cannot be null or empty.", "path"); 

    try { 
    using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { } 
    } catch (IOException) { 
    return true; 
    } 

    return false; 
} 
+0

Giống như @pranay rana, tôi đã thử phương pháp này, nhưng nó không phát hiện khi tệp được mở trong Notepad . – James

1

Nếu bạn có nghĩa là bạn muốn kiểm tra xem một tập tin được mở trước khi bạn cố gắng để mở nó , sau đó thì không. (Ít nhất là không phải không đi mức thấp và kiểm tra mọi xử lý tệp đang mở trong hệ thống.)

Bên cạnh đó, thông tin sẽ cũ khi bạn nhận được. Ngay cả khi thử nghiệm sẽ trả lại rằng tệp không mở, nó có thể đã được mở trước khi bạn có cơ hội sử dụng giá trị trả về.

Vì vậy, cách thích hợp để xử lý tình huống là thử mở tệp và xử lý bất kỳ lỗi nào có thể xảy ra.

0

Đồng ý. Tôi sẽ tạo ra một lớp được chỉ định mà kết thúc tốt đẹp các logic tập tin mở hoặc ít nhất là thử nghiệm (IsFileAvailable). Điều này sẽ cho phép bạn đặt quản lý ngoại lệ với một lớp cụ thể chịu trách nhiệm và làm cho nó có thể tái sử dụng được. Bạn thậm chí có thể áp dụng thêm logic, chẳng hạn như kiểm tra kích thước tệp để xem tệp có đang được viết thành v.v. hay không, để cung cấp phản hồi chi tiết hơn. Nó cũng sẽ làm cho mã tiêu thụ của bạn sạch hơn nhiều.

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