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
|
/**
* @brief Ecrit une ligne dans le fichier, en gerant l'acces exclusif au fichier.
*
* Methode qui ecrit le message passe en parametre, dans le fichier, en bloquant
* de facon exclusive la zone du fichier a ecrire pour eviter qu'une tierce application
* ne la bloque pour elle (attente qu'elle soit debloquee le cas echeant).
*
* @param ligne a ecrire dans le fichier.
*/
void Fichier::ecrireLigne(string p_message)
{
// Nombre d'octets a ecrire
m_nbCar = (DWORD)strlen(p_message.c_str())*sizeof(char);
// Preparation de la structure OVERLAPPED pour ecrire en fin de fichier
m_over.hEvent = 0;
m_over.Offset = SetFilePointer(m_fileHandle, 0, NULL, FILE_END);
m_over.OffsetHigh = 0;
// On bloque la zone a ecrire, de facon exclusive, pour eviter que l'ouverture du fichier par une tierce application n'empeche d'ecrire a cet emplacement.
// On utilise LockFileEx plutot que LockFile pour eviter que l'ouverture du fichier par une tierce application n'empeche de bloquer la zone.
// LockFileEx permet en effet d'attendre que cette zone soit debloquee pour la reserver.
LockFileEx(m_fileHandle, LOCKFILE_EXCLUSIVE_LOCK, 0, m_nbCar, 0, &m_over);
// Ecriture de la ligne dans la zone reservee
WriteFile(m_fileHandle, p_message.c_str(), m_nbCar, &m_nbLus, NULL);
// Deblocage de la zone reservee
UnlockFileEx(m_fileHandle, 0, m_nbCar, 0, &m_over);
} |
Partager