2010-02-02 3 views
1

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

ответ

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

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

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

+0

Я согласен с «share-none». Я не согласен с «GENERIC_READ | GENERIC_WRITE». Если CreateFile терпит неудачу, потому что у пользователя только есть разрешение на чтение. И файл также открывается кем-то другим, откуда вы знаете, получит ли GetLastError приоритет ERROR_SHARING_VIOLATION? –

+0

@Windows Программист: хорошая точка. но если вам нужен доступ на запись, вам все равно? Я думаю, это зависит от того, почему вы вызываете эту функцию. –

+0

Почему вы предполагаете, что Кришне нужен доступ для записи? Вопрос не сказал так. –

Смежные вопросы