Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 如何检查文件是否已打开_Winapi_Permissions - Fatal编程技术网

Winapi 如何检查文件是否已打开

Winapi 如何检查文件是否已打开,winapi,permissions,Winapi,Permissions,我需要检查文件夹中的任何文件是否被其他应用程序打开。不幸的是,如果文件处于打开状态,GetFileAttributesA()将返回错误的值。是否有解决方法,或者我做错了什么?GetFileAttributes与文件共享无关。要知道是否有人打开了该文件(从而阻止您打开它),唯一的方法是自己尝试打开它 bool IsFileOpenBySomeoneElse(LPCTSTR pszFilename) { HANDLE hfile = CreateFile(pszFilename,

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

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);
}   
但是编写这个函数对您没有好处,因为当您打开文件进行处理时,其他应用程序可能已经打开了该文件


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

我同意“不共享”的说法。我不同意“泛读泛写”的说法。如果CreateFile失败是因为用户只有读取权限,并且该文件也被其他人打开,那么您如何知道GetLastError是否会优先处理错误\u共享\u冲突?@Windows程序员:很好。但是如果您需要写访问权限,您在乎吗?我想这取决于你为什么调用这个函数。为什么你认为奎师那需要写访问?问题不是这样说的。问题是当文件已经打开时,所有这些都不起作用。它将阻止所有对信息的访问。@Krishna:什么信息?我不明白你在说什么。