📄 quickphoto.cpp
字号:
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 + -