⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 quickphoto.cpp

📁 大文件管理
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		lFileSeat = ulUrlId[i] & 0x3ffffff;
		//打开文件
		if(fpIdx == NULL || usLastNo != usFileNo)
		{
			sprintf(filename,"%s%c%s%d",syspath,LINKFLAG,INDEXNODEFILE,usFileNo);
			fpIdx = fopen(filename,"rb+");
			if(fpIdx == NULL) continue;
			usLastNo = usFileNo;
		}
		//定位
		if(fseek(fpIdx,lFileSeat*16,SEEK_SET))
			continue;
		//加锁
		if(_locking(fpIdx->_file,_LK_LOCK,16))
			continue;
		//读取信息,判断是否已经被删除
		if(fread(&cFlag,1,1,fpIdx) != 1)
		{
			fseek(fpIdx,lFileSeat*16,SEEK_SET);
			_locking(fpIdx->_file,_LK_UNLCK,16);
			continue;
		}
		//准备修改标志
		if(fseek(fpIdx,lFileSeat*16,SEEK_SET))
		{
			fseek(fpIdx,lFileSeat*16,SEEK_SET);
			_locking(fpIdx->_file,_LK_UNLCK,16);
			continue;
		}

		if(cFlag == 0)//该篇已经被删除了
		{
			fseek(fpIdx,lFileSeat*16,SEEK_SET);
			_locking(fpIdx->_file,_LK_UNLCK,16);
			continue;
		}
		//记录空闲磁盘空间
		if(IdleMemoryNode != NULL)
		{
			pNode = IdleMemoryNode;
			IdleMemoryNode = (iNode *)pNode->lContentLen;
		}
		else
		{
			pNode = &cpUsedNode[lUsedNodeFirst][lUsedNodeSecond++];			
			if(lUsedNodeSecond >= 10240)
			{
				lUsedNodeFirst++;
				lUsedNodeSecond = 0;
				if(cpUsedNode[lUsedNodeFirst] == NULL)
					cpUsedNode[lUsedNodeFirst] = new iNode[10240];
			}
		}
		cFlag = 0;
		//写删除标志
		if(fwrite(&cFlag,1,1,fpIdx) != 1)
		{
			fseek(fpIdx,lFileSeat*16,SEEK_SET);
			_locking(fpIdx->_file,_LK_UNLCK,16);
			continue;
		}
		if(fseek(fpIdx,lFileSeat*16+1,SEEK_SET))
		{
			fseek(fpIdx,lFileSeat*16,SEEK_SET);
			_locking(fpIdx->_file,_LK_UNLCK,16);
			continue;
		}
		if(fread(&cFlag,1,1,fpIdx)!= 1)
		{
			fseek(fpIdx,lFileSeat*16,SEEK_SET);
			_locking(fpIdx->_file,_LK_UNLCK,16);
			continue;
		}
		if(cFlag < 0 || cFlag >11)
		{
			fseek(fpIdx,lFileSeat*16,SEEK_SET);
			_locking(fpIdx->_file,_LK_UNLCK,16);
			continue;
		}

		if(fseek(fpIdx,lFileSeat*16+10,SEEK_SET))
		{
			fseek(fpIdx,lFileSeat*16,SEEK_SET);
			_locking(fpIdx->_file,_LK_UNLCK,16);
			continue;
		}
		if(fread(&pNode->usFileNo,2,1,fpIdx) != 1)
		{
			fseek(fpIdx,lFileSeat*16,SEEK_SET);
			_locking(fpIdx->_file,_LK_UNLCK,16);
			continue;
		}
		if(fread(&pNode->lFileSeat,4,1,fpIdx) != 1)
		{
			fseek(fpIdx,lFileSeat*16,SEEK_SET);
			_locking(fpIdx->_file,_LK_UNLCK,16);
			continue;
		}
//		pNode->lFileSeat = lFileSeat;
//		pNode->usFileNo = usFileNo;
		pNode->lContentLen = (long)IdleFileNode[cFlag];
		fseek(fpIdx,lFileSeat*16,SEEK_SET);
		_locking(fpIdx->_file,_LK_UNLCK,16);
		IdleFileNode[cFlag] = pNode;
	}
	if(fpIdx)
		fclose(fpIdx);
	return 0;
}
/***********************************************************************************
函数功能:在系统中更新一批网页快照
参    数:
		  long lPhotoNum:		更新的网页快照的个数
		  long *ulpUrlId:		更新的网页快照的Id列表
		  long *lpPageLen;		更新的网页快照的长度列表
		  char *pPage;			更新的网页快照的内容,写在一起,并且每个都有0结束符
返 回 值:成功返回0,否则返回其他
程 序 员:乔建秀
修改时间:2003.5.8
***********************************************************************************/
long QuickPhoto::UpdatePhoto(long lPhotoNum,unsigned long *ulpUrlId,long *lpPageLen,char *pPage)
{
	long lRet = DelPhoto(lPhotoNum,ulpUrlId);
	if(lRet) return lRet;
	return this->AddPhoto(lPhotoNum,ulpUrlId,lpPageLen,pPage);
}
/***********************************************************************************
函数功能:根据指定的快照Id号,检索出对应的快照来
参    数:
		  unsigned long lUrlId:	指定的快照的ID号
		  char *SearchStr:		检索词,作为反显的标志
		  char *pRetPage;		返回的带反显的网页快照
返 回 值:成功返回0,否则返回其他
程 序 员:乔建秀
修改时间:2003.5.8
***********************************************************************************/
long QuickPhoto::SearchPhoto(unsigned long ulUrlId,char *SearchStr,char *&pRetPage)
{ 
//	pRetPage = new char[1024];
//	strcpy(pRetPage,"<p></tr></table><h3>快照系统正在升级中,请稍候访问</h3>\n");
//	return strlen(pRetPage);


	pRetPage = NULL;
	char filename[300];
	unsigned short usFileNo = (unsigned short)(ulUrlId>>26);
	long lFileSeat = ulUrlId & 0x3ffffff;
	sprintf(filename,"%s%c%s%d",syspath,LINKFLAG,INDEXNODEFILE,usFileNo);
	FILE *fp = fopen(filename,"rb");
	FILE *fp1 = NULL;
	if(fp == NULL)
		return -1;
	if(fseek(fp,16*lFileSeat,SEEK_SET))
	{
		fclose(fp);
		return -1;
	}
	char cFlag;
	if(_locking(fp->_file,_LK_LOCK,16)==-1)
	{
		fclose(fp);
		return -1;
	}
	fread(&cFlag,1,1,fp);
	if(cFlag == 0)
	{
		fseek(fp,16*lFileSeat,SEEK_SET);
		_locking(fp->_file,_LK_UNLCK,16);
		fclose(fp);
		return -1;
	}
	fread(&cFlag,1,1,fp);
	if(cFlag < 0 || cFlag > 12)
	{
		fseek(fp,16*lFileSeat,SEEK_SET);
		_locking(fp->_file,_LK_UNLCK,16);
		fclose(fp);
		return -1;
	}

	long lMaxLen = 256 << cFlag;

	long lContentLen,lPageLen;
	fread(&lContentLen,4,1,fp);	//压缩后文件长度
	fread(&lPageLen,4,1,fp);			//压缩前文章长度
	fread(&usFileNo,2,1,fp);		//压缩后文本所在文件
	fread(&lFileSeat,4,1,fp);		//文本偏移
	fseek(fp,16*lFileSeat,SEEK_SET);
	fp1 = fopen(ppFileList[usFileNo],"rb");
	if(fp1 == NULL)
	{
		_locking(fp->_file,_LK_UNLCK,16);
		fclose(fp);
		return -1;
	}
	fseek(fp1,lFileSeat,0);
	char *pReadBuf = new char [lMaxLen+100];
	lPageLen = lPageLen + 1000;
	char *pUnCmpressbuf = new char[lPageLen+1024];
	fread(pReadBuf,1,lMaxLen,fp1);
	_locking(fp->_file,_LK_UNLCK,16);
	fclose(fp);
	fclose(fp1);
	long lRet;
pUnCmpressbuf[0] = 0;
	lRet = UnCompressText(pReadBuf,lContentLen,pUnCmpressbuf,lPageLen);
	delete pReadBuf;
	pRetPage = pUnCmpressbuf;

	if(lRet<=0)
	{
		if(pRetPage)
			delete pRetPage;
		pRetPage = NULL;
		return -1;
	}
	return lRet;
}
/***********************************************************************************
函数功能:保存系统
参    数:none
返 回 值:成功返回0,否则返回其他
程 序 员:乔建秀
修改时间:2003.5.8
***********************************************************************************/
long QuickPhoto::SaveSys()
{
	char filename[300];
	sprintf(filename,"%s%c%s",syspath,LINKFLAG,SYSFILE);
	char filename1[300];
	sprintf(filename1,"%s.bak",filename);
	struct stat fileinfo;
	stat(filename,&fileinfo);
	if(fileinfo.st_size > (30<<10))
	{
		remove(filename1);
		rename(filename,filename1);
	}
	FILE *fp = fopen(filename,"wb");
	if(fp == NULL)
		return -1;
	//保存文件列表
	fwrite(&lFileListSize,4,1,fp);
	fwrite(lpFileSize,4,lFileListSize,fp);
	long lLen,i;
	for(i=0;i<lFileListSize;i++)
	{
		lLen = strlen(ppFileList[i]);
		fwrite(&lLen,4,1,fp);
		fwrite(ppFileList[i],1,lLen,fp);
	}
	fwrite(&lNowUseFileNo,2,1,fp);
	fwrite(&lNowFileLeftSpace,4,1,fp);
	//保存闲置节点
	iNode *pNode = NULL;
	for(i=0;i<12;i++)
	{
		pNode = IdleFileNode[i];
		while(pNode)
		{
			fwrite(&pNode->lFileSeat,4,1,fp);
			fwrite(&pNode->usFileNo,2,1,fp);			
			pNode = (iNode *)pNode->lContentLen;
		}
		lLen = -1;
		fwrite(&lLen,1,4,fp);
	}
	fclose(fp);
	return 0;
}
/***********************************************************************************
函数功能:载入系统
参    数:
		  none
返 回 值:成功返回0,否则返回其他
程 序 员:乔建秀
修改时间:2003.5.8
***********************************************************************************/
long QuickPhoto::LoadSys()
{
	char filename[300];
	sprintf(filename,"%s%c%s",syspath,LINKFLAG,SYSFILE);
	FILE *fp = fopen(filename,"rb");
	if(fp == NULL)
		return -1;
	//载入文件列表
	fread(&lFileListSize,4,1,fp);
	fread(lpFileSize,4,lFileListSize,fp);
	long lLen,i;
	for(i=0;i<lFileListSize;i++)
	{
		fread(&lLen,4,1,fp);
		if(ppFileList[i]) delete ppFileList[i];
		ppFileList[i] = new char[lLen+2];
		fread(ppFileList[i],1,lLen,fp);
		ppFileList[i][lLen] = 0;
	}
	fread(&lNowUseFileNo,2,1,fp);
	fread(&lNowFileLeftSpace,4,1,fp);
	//保存闲置节点
	iNode *pNode = NULL, *pLastNode;
	long lFileSeat;
	unsigned short usFileNo;
	for(i=0;i<12;i++)
	{
		pNode = IdleFileNode[i] = NULL;	
		pLastNode = NULL;
		while(1)
		{
			fread(&lFileSeat,4,1,fp);
			if(lFileSeat == -1)
				break;
			fread(&usFileNo,2,1,fp);
			pNode = &cpUsedNode[lUsedNodeFirst][lUsedNodeSecond++];			
			if(lUsedNodeSecond >= 10240)
			{
				lUsedNodeFirst++;
				lUsedNodeSecond = 0;
				if(cpUsedNode[lUsedNodeFirst] == NULL)
					cpUsedNode[lUsedNodeFirst] = new iNode[10240];
			}
			pNode->lFileSeat = lFileSeat;
			pNode->usFileNo = usFileNo;
			pNode->lContentLen = NULL;
			if(pLastNode == NULL)
			{
				IdleFileNode[i] = pNode;
				pLastNode = pNode;
			}
			else
			{
				pLastNode->lContentLen = (long)pNode;
				pLastNode = pNode;
			}
		}
	}
	fclose(fp);
	return 0;
}
long QuickPhoto::AddFileToFileList(char *filename,long lSize)
{
	if(this->lFileListSize > 60000)
		return -1;
	if(lSize <= 1 || lSize > 2000)
		return -1;
	char ch = 0;
	lSize = lSize << 20;
	if(access(filename,0) == 0)
		return -1;
	FILE *fp = fopen(filename,"wb");	
	if(fp == NULL)
	{
		printf("open %s error [wb]\n",filename);
		return -1;
	}
	if(fseek(fp,lSize-1,0))
	{
		fclose(fp);
		printf("seek error!\n");
		return -2;
	}
	if(fwrite(&ch,1,1,fp) != 1)
	{
		fclose(fp);
		printf("write error!\n");
		return -2;
	}
	fclose(fp);
	long lLen = strlen(filename);
	this->ppFileList[lFileListSize] = new char [lLen + 2];
	strcpy(ppFileList[lFileListSize],filename);
	this->lpFileSize[lFileListSize] = lSize;
	lFileListSize ++;
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -