www.pudn.com > onlyC.rar > fileOper.c


#include "fileOper.h" 
/* 
 _______________________________________________ 
|FUNCTION		:FileAddString 
|OPERATIN		:文件末尾添加字符串 
|RETURN			: 
|PARAMETER		: 
|  filename		:文件名 
|  addstring	:要添加的字符串 
 _______________________________________________ 
*/ 
void FileAddString(char *filename,char *addstring) 
{ 
	FILE *fp; 
	if((fp=fopen(filename,"rb+"))==NULL)return; 
	fseek(fp,0,SEEK_END); 
	fprintf(fp,"%s",addstring); 
	fclose(fp); 
} 
/* 
 _______________________________________________ 
|FUNCTIONNAME	:FileReplace 
|OPERATION		:在文件中替换一个字符串,只替换一次 
|PARAMETER		: 
|	filename		:文件名 
|	str_find		:查找的字符串 
|	str_rpelace		:要替换的字符串 
|	int_buffer		:缓冲大小 
|	return			:是否替换成功(0,false,1,true) 
|_________________________________________________ 
*/ 
int FileReplace(char *filename,char *str_find,char *str_replace,int int_buffer) 
{ 
	long long_StringSeek,readSeek,writeSeek,fileSize; 
	int int_Data; 
	int findLen,replaceLen,int_SubStr; 
	FILE *fp1; 
 
	long_StringSeek=FileFindString(filename,str_find,0,int_buffer); 
	if(long_StringSeek==-1)return 0; 
 
	fp1=fopen(filename,"rb+"); 
	findLen=strlen(str_find); 
	replaceLen=strlen(str_replace); 
	int_SubStr=findLen-replaceLen; 
	fileSize=GetFileLength(filename); 
 
 
	if(int_SubStr==0) 
	{ 
 
	}else if(int_SubStr<0) 
	{ 
		ChangeFileSize(filename,fileSize-int_SubStr);/*变大*/ 
		fseek(fp1,-1L,SEEK_END); 
		writeSeek=ftell(fp1); 
		readSeek=writeSeek+int_SubStr; 
		for(;readSeek>=long_StringSeek;readSeek--,writeSeek--) 
		{ 
			fseek(fp1,readSeek,SEEK_SET); 
			int_Data=fgetc(fp1); 
			fseek(fp1,writeSeek,SEEK_SET); 
			fputc(int_Data,fp1); 
		} 
	}else if(int_SubStr>0)/*文件变小*/ 
	{ 
		writeSeek=long_StringSeek+replaceLen; 
		readSeek=writeSeek+int_SubStr; 
		for(;readSeek 
|PARAMATER		: 
|	filename	:文件名 
|	size		:要设置的大小 
| 
—————————————————————————— 
*/ 
void ChangeFileSize(char *filename,long size) 
{ 
   int fh; 
   if( (fh = _open( filename, _O_RDWR | _O_CREAT, _S_IREAD  
                   | _S_IWRITE ))  != -1 ) 
   { 
	   _chsize(fh,size); 
   }  
   _close(fh); 
   return;	 
} 
 
//得到文件大小(byte) 
long GetFileLength(char *filename) 
{ 
   int fh; 
   long file_size; 
   if( (fh = _open( filename, _O_RDWR | _O_CREAT, _S_IREAD  
                   | _S_IWRITE ))  != -1 ) 
   { 
	   file_size=_filelength( fh ) ; 
   }else  
   { 
	   file_size=-1; 
   } 
   _close(fh); 
   return file_size; 
} 
/* 
  _______________________________________________ 
 | 
 |FUNCTIONNAME	:Buffer_ScanString 
 |OPERATION		:在Buffer 中的指定位置内查找的字符串(专用于FindFileString的核心代码) 
 |RETRUN		:返回在找到的位置与point的距离,-1则表示找不到. 
 |PARAMETER		: 
 |	buffer		:缓冲区 
 |	str_find	:查找的字符串 
 |	point		:在Buffer 中的起始位置 
 |	point_space	:比较次数,比较空间, 
 |	int_buffer	:缓冲区大小 
 | _______________________________________________ 
*/ 
int Buffer_ScanString(char *buffer,char *str_find,int point,int point_space,int int_BufferLong) 
{ 
	int int_i; 
	int cmp_point,cmp_next; 
	int int_buffer,int_findlen; 
 
	cmp_point=point % int_BufferLong; 
	int_buffer=point_space; 
	int_findlen=strlen(str_find); 
 
	for(cmp_next=cmp_point+int_buffer;cmp_point=int_findlen)break;//如果两字符串相等就走人. 
	} 
	if(cmp_pointint_buffer)int_buffer=int_findlen;/*字符串长度必定小于单个区域大小*/ 
	int_BufferLong=int_buffer*2; 
 
	/*计算区域的起始位置*/ 
	cmp_ad1=0; 
	cmp_ad2=int_buffer; 
 
   	/* Open a file 得到文件大小*/ 
	file_size=GetFileLength(filename); 
	if(file_size==-1)return -1; 
 
	/*制配缓冲大小*/ 
   buffer=(char *)malloc(sizeof(char)*int_buffer*2); 
 
   fp=fopen(filename,"rb"); 
   fseek(fp,lng_SeekStart,0); 
   file_size-=lng_SeekStart; 
   lng_Loop_End=file_size/int_buffer;/*计算文件有几个Buffer,(区域)*/ 
   cmp_point=cmp_ad1;/*是0;*/ 
 
   /*如果文件大小连一个区都填不满*/ 
   if(lng_Loop_End<1) 
   { 
	   /*lost something*/ 
	   fread(buffer,file_size,1,fp); 
	   cmp_ret=Buffer_ScanString(buffer,str_find,0,file_size,int_BufferLong); 
	   if(cmp_ret!=-1) 
	   { 
		   lng_FindSeek=cmp_ret; 
	   }else 
	   { 
		   lng_FindSeek=-1; 
	   } 
	   goto FindSeekQuit; 
   } 
 
 
   /*以下是文件起码超过一个区域时的情况*/ 
   fread(buffer+cmp_ad1,int_buffer,1,fp);/*初始化(先把第一个缓冲区填满)*/ 
   for(lng_Loop_Go=1;lng_Loop_Go0)fread(buffer+cmp_ret,int_i,1,fp); 
   /*函数中心,窗口比较两字符串是否一样,其实是从重复上面的比较.*/ 
   cmp_ret=(int_buffer+int_i)-(int_findlen-1); 
   cmp_ret=Buffer_ScanString(buffer,str_find,cmp_point,cmp_ret,int_BufferLong); 
 
   if(cmp_ret!=-1)/*找到*/ 
   { 
	   lng_FindSeek=(lng_Loop_End-1)*int_buffer+cmp_ret;		   		    
   }else 
   { 
	   lng_FindSeek=-1; 
   } 
     
/*退出函数,释放资源*/ 
FindSeekQuit: 
     
	free(buffer); 
	fclose(fp); 
	if(lng_FindSeek>=0)lng_FindSeek+=lng_SeekStart; 
	return lng_FindSeek; 
}