Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 4 của 4
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Kiểm tra một file đã được mở bởi chương trình khác hay ko?

    Hôm nay Kevin làm một cái chương trình, trong đó liên quan đến phần duyệt các files trong một thư mục chỉ định, sau đó kiểm tra từng file có được mở bởi một ứng dụng khác hay ko. Vấn đề xảy ra là.

    1. Kevin sử dụng API CreateFile để check với Exclusive access thì nó có khả năng kiểm tra điều này, nhưng mà nó lại giữ handle của file không nhả (Chỉ nhà khi mình thoát khỏi chương trình), mặc dù đã gọi CloseHandle. Không lẽ lại đi duyệt các handle thì hơi bị mệt công. Không biết có anh em nào biết cách nào khác hiệu quả không?

    Đây là hàm, mà Kevin viết.


    Mã:
    BOOL IsFileAlreadyOpen(TCHAR* szFileName){    HANDLE hFile = CreateFile(        szFileName,        GENERIC_WRITE,        NULL,                //Exclusive access        NULL,        OPEN_EXISTING,        FILE_ATTRIBUTE_NORMAL,        NULL        );     BOOL bResult = (hFile == INVALID_HANDLE_VALUE) ? TRUE : FALSE;    CloseHandle(hFile);     return bResult;}
    Hàm này chỉ ko nhả handle khi sử dụng kèm theo với FindFile APIs và chỉ bị trên Windows XP. Thằng Windows 7 vẫn ngon.

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    portable:

    Mã:
    #include <iostream> int main() {    if( 0 != rename( "a.txt", "a.txt" ) ) {        std::cout << "File is currently opened.
    ";    }}
    Try this.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    ý tưởng của rox_rock hay đấy[IMG]images/smilies/wink.png[/IMG]
    thank[IMG]images/smilies/clap_grin.gif[/IMG]

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Ah, Kevin đã phát hiện ra nguyên nhân ko phải do vấn đề này. Lỗi là do phần Kevin hook vào hàm duyệt file, mục đích là chỉ có chương trình của mình làm việc với nó mà thôi, nhưng nó lại bị giữ handle trên windows XP. Kevin đã đổi phương pháp hook, kết quả đã chạy OK.

    Hàm IsFileAlreadyOpen Kevin viết chạy ổn đó, bạn nào sử dụng thì bỏ CloseHandle với INVALID_HANDLE_VALUE để tránh lỗi tiềm tàng sau này.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •