自己实现的文件独占锁



在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();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值