1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
struct filecheckinfo
{
std::string filename;
};
DWORD WINAPI my_thread_func(LPVOID param)
{
filecheckinfo* fci = reinterpret_cast<filecheckinfo*>(param);
if (!fci)
return (DWORD)(-1);
do {
// pas DENY_WRITE, mais bien EXCLUSIVE. Les deux valeurs n'ont pas du tout la
// même sémantique, et c'est la sémantique de EXCLUSIVE que tu cherches
// a obtenir.
OFSTRUCT reopenbuf;
HFILE f = OpenFileA(fci->filename.c_str(), &reopenbuf, OF_SHARE_EXCLUSIVE);
if (f != HFILE_ERROR) {
// si on a réussi à ouvrir le fichier, on est bon.
CloseHandle(f);
break;
}
Sleep(250);
}
return 0;
}
// A appeler dans le thread d'attente du fichier.
// a noter que le WaitForSingleObject peut prendre une paramètre de timeout qui n'est pas
// INFINITE, ce qui va le faire échouer régulièrement sur une erreur WAIT_TIMEOUT.
// Du coup, un autre traitement est possible toutes les X millisecondes si besoin.
DWORD do_check(const std::string filename)
{
filecheckinfo fci;
DWORD result;
HANDLE hthread = CreateThread(NULL, 0, my_thread_func, (LPVOID)(&fci), 0, NULL);
if (hthread == INVALID_HANDLE_VALUE)
return (DWORD)(-1);
WaitForSingleObject(hthread, INFINITE);
GetExitCodeThread(hthread, &result);
return result;
} |
Partager