在Windows中,文件可以共享模式打开,也可以以独占方式打开,通过在API CreateFile 传递不同的参数实现(0,File_Share_Read,File_Share_Write)。
本文没有使用API,而是自己实现锁机制。可以避免应用程序多次打开同一个文件。代码如下:
//head File
class CFileLocker
{
public:
CFileLocker(const string& sFilePath);
CFileLocker(const char* szFilePath);
~CFileLocker();
private:
static void LockFile(const string& sFileName);
static void UnLockFile(const string& sFileName);
string m_sFile;
};
//Source File
static map<string, CCriticalSection> g_FileLocks;
static map<string, int> g_LockCount;
static CCriticalSection g_lockMap;
CFileLocker::CFileLocker(const string& sFilePath)
{
if (!sFilePath.empty())
{
LockFile(sFilePath);
m_sFile = sFilePath;
}
}
CFileLocker::CFileLocker(const char* szFilePath)
{
if (NULL != szFilePath && szFilePath[0] != '\0')
{
LockFile(szFilePath);
m_sFile = szFilePath;
}
}
CFileLocker::~CFileLocker()
{
if (!m_sFile.empty())
{
UnLockFile(m_sFile);
}
}
void CFileLocker::LockFile(const string& sFileName)
{
CCriticalSection* pMutex = NULL;
{
g_lockMap.Lock();
//create object
if (g_FileLocks.count(sFileName) == 0)
{
pMutex = new CCriticalSection;
g_FileLocks[sFileName] = pMutex;
g_LockCount[sFileName] = 0;
}
else
{
pMutex = g_FileLocks[sFileName];
}
g_LockCount[sFileName]++;
g_lockMap.UnLock();
}
if (NULL != pMutex)
{
pMutex->Lock();
}
}
void CFileLocker::UnLockFile(const string& sFileName)
{
g_lockMap.Lock();
g_FileLocks[sFileName]->Unlock();
if (g_LockCount[sFileName] == 1)
{
g_LockCount.erase(sFileName);
delete g_FileLocks[sFileName];
g_FileLocks.erase(sFileName);
}
else
{
g_LockCount[sFileName]--;
}
g_lockMap.UnLock();
}