Как проверить, открыт ли файл - PullRequest
1 голос
/ 02 февраля 2010

Мне нужно проверить, открыты ли какие-либо файлы в папке другими приложениями или нет.К сожалению, если файл открыт, GetFileAttributesA () возвращает неправильные значения.Есть ли обходной путь для этого или я делаю что-то не так?

1 Ответ

1 голос
/ 02 февраля 2010

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);
}   

Но написание этой функции бесполезно, потому что к тому времени, когда вы приступаете к открытию файла для обработки, у какого-то другого приложения этот файл может открыться.

Единственный безопасный способ сделать это - сделать то, что вы собираетесь делать с файлом, и когда вы попытаетесь открыть его для обработки, обратите внимание на значение ошибки, если вы потерпите неудачу. После того, как файл открыт, вы должны держать его открытым, пока не закончите или другой процесс не сможет открыть (или удалить!) За вашей спиной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...