Im utilisant l'API CreateFile et parfois échoue de manière aléatoire avec l'erreur: ERROR_SHARING_VIOLATION.CreateFile échoue avec l'erreur ERROR_SHARING_VIOLATION
J'ai googlé et il n'y a presque rien à propos de cette erreur. Ce qui est étrange, c'est que la prochaine fois, il est assez content d'ouvrir le même fichier.
Voici mon code:
void FileHandle::open(const char* fileName, FILE_MODE mode)
{
if (m_bIsOpen)
close();
HANDLE fh = NULL;
DWORD dwDesiredAccess = GENERIC_READ;
DWORD dwShareMode = FILE_SHARE_READ;
DWORD dwCreationDisposition = OPEN_EXISTING;
switch (mode)
{
case FILE_READ:
break;
case FILE_WRITE:
dwDesiredAccess = GENERIC_WRITE;
dwShareMode = 0;
dwCreationDisposition = CREATE_ALWAYS;
break;
case FILE_APPEND:
dwDesiredAccess = GENERIC_WRITE;
dwShareMode = 0;
dwCreationDisposition = OPEN_ALWAYS;
break;
default:
throw gcException(ERR_INVALID, "The mode was invalid");
break;
}
fh = CreateFile(fileName, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, 0, NULL);
if (!fh || fh == INVALID_HANDLE_VALUE)
throw gcException(ERR_INVALIDFILE, GetLastError(), gcString("Failed to open the file {0}", fileName));
m_hFileHandle = fh;
m_bIsOpen = true;
if (mode == FILE_APPEND)
{
DWORD high = 0;
DWORD low = GetFileSize(fh, &high);
uint64 pos = (((uint64)high)<<32) + (uint64)low;
seek(pos);
}
}
que je fais quelque chose de mal ou est-il un problème avec l'api?
Edit: Im en utilisant le nom complet du fichier (par exemple C: \ somefile.txt) et le mode = FILE_Write
Quel cas s'exécute lorsque l'appel échoue? Aussi, vous devriez vérifier seulement si le handle de fichier est égal à INVALID_HANDLE_VALUE, ne vérifiez pas s'il est NULL. Veuillez également déplacer l'appel GetLastError avant le lancer et le stocker dans un DWORD. –
Peu importe si je le compare à NULL, le code d'erreur est 32 (pense que j'ai été mélangé avec et devrait être ERROR_SHARING_VIOLATION). – Lodle
Utilisez le moniteur de processus (http://technet.microsoft.com/en-us/sysinternals/bb896645) et configurez un filtre pour le chemin d'accès au fichier que vous ouvrez. Vérifiez qu'aucun autre processus (par exemple, anti-malware, recherche de bureau, sauvegarde) ne l'ouvre. –