CreateFile échoue avec l'erreur ERROR_SHARING_VIOLATION

Im en utilisant l'api CreateFile et quelques fois au hasard échoue avec l'erreur: ERROR_SHARING_VIOLATION.

J'ai cherché sur google et il n'y a presque rien à propos de cette erreur. La chose étrange est que la prochaine fois, il est tout à fait heureux 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);
    }
}

Je fais quelque chose de mal ou est-il un problème avec l'api?

Edit:
Im en utilisant le nom de fichier complet (c'est à dire C:\somefile.txt) et mode=FILE_WRITE

Auquel cas s'exécute lors de l'appel échoue? Aussi, vous devez vérifier que si le descripteur de fichier est égal à INVALID_HANDLE_VALUE, de ne pas vérifier si il est NUL. Aussi, merci de déplacer le GetLastError appeler avant de le jeter et de le stocker dans un DWORD.
N'a pas d'importance si je regarde par rapport à NULL, le code d'erreur est de 32 (crois que j'ai mélangé avec et doit être ERROR_SHARING_VIOLATION).
Utilisez le Moniteur de Processus (technet.microsoft.com/en-us/sysinternals/bb896645) et de définir un filtre pour le chemin d'accès au fichier que vous ouvrez. Vérifiez qu'aucun autre processus (par exemple, anti-malware, bureau de la recherche, de sauvegarde) sont de l'ouvrir.

OriginalL'auteur Lodle | 2010-12-14