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.
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
Vous devez vous connecter pour publier un commentaire.
Il n'y a rien de mal avec CreateFile - une violation de partage signifie que quelque chose d'autre a le même fichier ouvrir. Ce qui pourrait être votre propre programme, si vous avez ouvert le fichier avec un mode de partage de 0, vous ne serez pas en mesure de l'ouvrir à nouveau.
Lorsque vous obtenez le message d'erreur vous pouvez utiliser Process Explorer afin de déterminer quels processus ont ouvert le fichier.
Viens de découvrir qu'une partie de mon code de téléchargement de la même image deux fois dans deux threads différents, ainsi que le premier thread pour ouvrir le fichier et le second serait de mourir.
OriginalL'auteur shf301
Est-il anti-virus sur la machine? Parfois, un AV (ou un autre logiciel qui surveille les fichiers) et du calendrier peuvent provoquer le partage des conflits.
Cela est particulièrement vrai si vous êtes à l'ouverture d'un fichier existant pour l'accès exclusif (ce serait le cas pour la
FILE_WRITE
etFILE_APPEND
cas, si le fichier existe déjà).OriginalL'auteur Michael Burr
Je ne veux pas manquer de respect, mais je me suis tourné dans le pied la semaine dernière sur quelque chose de semblable:
Êtes-vous sûr rien d'autre n'a le fichier est ouvert de manière à empêcher les accès demandés?
Dans mon cas, j'avais utilisé ctrl-Z dans un Linux fenêtre de commande pour suspendre un programme qui a créé une socket de connexion, puis je suis allé au lit. Le lendemain matin, après quelques changements simples, j'ai continué à obtenir "impossible de créer le socket: service en cours d'utilisation" des messages lors de l'exécution du programme. Malheureusement, j'ai passé d'innombrables heures sur ce que j'avais cassé. Une fois que j'ai tué la délinquance processus interrompu, il a bien fonctionné.
OriginalL'auteur wallyk
Microsoft dire ici que cela peut arriver et il à l'application de réessayer quand il ne. Horrible mais là vous allez.
OriginalL'auteur mrdiskodave