【问题标题】:How to check if a file is open如何检查文件是否打开
【发布时间】:2010-02-02 02:22:48
【问题描述】:

我需要检查文件夹中的任何文件是否被其他应用程序打开。不幸的是,如果文件已打开,GetFileAttributesA() 会返回错误值。是否有解决方法或者我做错了什么?

【问题讨论】:

    标签: winapi permissions


    【解决方案1】:

    GetFileAttributes 与文件共享无关。知道某人是否打开了文件(从而阻止您打开它)的唯一方法是尝试自己打开它。

    bool IsFileOpenBySomeoneElse(LPCTSTR pszFilename)
    {
        HANDLE hfile = CreateFile(pszFilename, 
                                  GENERIC_READ /*| GENERIC_WRITE*/, 
                                  0, //0 is share-none
                                  NULL,
                                  OPEN_ALWAYS);
        if (hfile != INVALID_HANDLE_VALUE)
        {
           CloseHandle(hfile);
           return false;
        }
        return (GetLastError() == ERROR_SHARING_VIOLATION);
    }   
    

    但是编写这个函数对你没有好处,因为当你开始打开文件进行处理时,其他一些应用程序可能已经打开了文件。

    执行此操作的唯一安全方法是继续执行您打算对文件执行的操作,当您尝试打开它进行处理时,如果失败,请注意错误值。一旦你打开了文件,你必须保持它打开直到你完成或其他进程可以在你背后打开它(或删除它!)。

    【讨论】:

    • 我同意“share-none”。我不同意“GENERIC_READ | GENERIC_WRITE”。如果 CreateFile 失败是因为用户只有读取权限,并且文件也被其他人打开,你怎么知道 GetLastError 是否会优先处理 ERROR_SHARING_VIOLATION?
    • @Windows 程序员:好点。但是如果你需要写权限,你在乎吗?我想这取决于你为什么要调用这个函数。
    • 您为什么认为 Krishna 需要写入权限?问题没有这么说。
    • 问题是当文件已经打开时所有这些都不起作用。它将阻止对信息的所有访问。
    • @Krishna:什么信息?我不明白你在说什么。
    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2015-12-01
    相关资源
    最近更新 更多