Je suis en utilisant l'API Createefile et parfois, elle échoue au hasard avec l'erreur: error_sharing_violation.
J'ai googlé et il n'y a presque rien de sur cette erreur. La chose étrange est la prochaine fois qu'il est assez heureux d'ouvrir le même fichier. P>
Voici mon code: P>
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);
}
}
4 Réponses :
Y a-t-il un anti-virus sur la machine? Parfois, un AV (ou un autre logiciel qui surveille les fichiers) Les opérations et le timing peuvent causer des conflits de partage. p>
Ceci est particulièrement vrai si vous ouvrez un fichier existant pour un accès exclusif (ce serait le cas pour le File_write CODE> et File_AppEND code> cas si le fichier existe déjà) . P>
Pas d'av. Arrive environ 1 sur 20 va
Il n'y a rien de mal à Createfile - une violation partagée signifie que quelque chose d'autre a le même fichier ouvert. Ce qui pourrait être votre propre programme, si vous avez le fichier ouvert avec un mode de partage de 0, vous ne pourrez plus l'ouvrir à nouveau. P>
Lorsque vous recevez l'erreur, vous pouvez utiliser Explorateur de processus pour déterminer les processus avoir le fichier ouvert. p>
Sa création d'un nouveau fichier qui n'a jamais existé avant et rien d'autre n'a le nom du nouveau fichier à ce stade (son magasin de cache d'image).
Je viens de découvrir qu'une partie de mon code téléchargait la même image deux fois dans deux threads différents, le premier thread ouvrirait le fichier et le second mourrait.
Je veux dire aucun manque de respect, mais je me tire juste dans le pied la semaine dernière sur quelque chose de similaire: p>
êtes-vous sûr em> rien d'autre n'a le fichier ouvert d'une manière qui empêcherait l'accès demandé? p>
Dans mon cas, j'avais utilisé Ctrl-Z dans une fenêtre de commande Linux pour suspendre un programme qui a créé une connexion de socket, puis je me suis couchée. Lancez le lendemain matin après quelques modifications simples, je me suis maintenu "Impossible de créer un socket: Service d'utilisation" des messages lors de l'exécution du programme. Malheureusement, j'ai passé des heures à déboguer ce que j'avais cassé. Une fois que j'ai tué le processus en suspension offensant, cela a fonctionné bien. P>
Microsoft Say ici que cela peut arriver à la demande de réessayer quand ça fait. Horrible mais là tu vas. P>
Les liens vers des ressources externes sont encouragés, mais veuillez ajouter du contexte autour du lien afin que vos collègues utilisateurs auront une idée de ce que c'est et pourquoi c'est là. Citez toujours la partie la plus pertinente d'un lien important, au cas où le site cible est inaccessible ou se transforme en permanence hors ligne.
web.archive.org/ Web / 20150328004214 / https: // ... sert toujours le lien. Résumé: La seule cause est que le fichier est déjà ouvert (mais non partagé à être ouvert par d'autres personnes).
Quel cas fonctionne lorsque l'appel échoue? Vous devez également vérifier que si la poignée de fichier est égale à invalid_handle_value, ne vérifiez pas si c'est NULL. Veuillez également déplacer l'appel GetLasterRor avant le lancer et le stocker dans un Dword.
Peu importe si je le vérifie contre NULL, le code d'erreur est 32 (pense que je me suis mélangé avec et devrait être erron_sharing_violation).
Utiliser le moniteur de processus ( TECHNET.MICROSOFT.COM/EN-US/SYSITINERNALS/BB896645) Et configurez un filtre pour le chemin du fichier que vous ouvrez. Vérifiez qu'aucun autre processus (par exemple, anti-malware, recherche de bureau, sauvegarde) l'ouvre.